如何使 Github 上面 fork 的代码与原仓库保持同步更新
# 引言
如果我们是一个“面向 Github 编程”的程序员,那么想象以下情境:
- 你 fork 一份别人的代码然后定制化,然后你更新到自己的仓库里
假定你的代码要保持更新(不断追踪作者代码的更新)
- 达则兼济天下,你有一部分代码写得很漂亮,你想贡献给开源社区
然后你把自己的代码提交 PR 到原始作者仓库,然后你发现作者的代码和你的合并不到一块了。你需要先拉取更新,然后本地合并,最后才能贡献代码。
也就是说:在你 fork 之后,上游仓库(即被你 fork 的仓库)又更新了,但 github 不会自动帮你把 xiaolai 的仓库同步给你 fork 后的仓库。最省事的办法可能是:
- 在你 fork 的仓库 setting 页翻到最下方,然后 delete 这个仓库;
- 然后重新 fork xiaolai 的仓库,并 git clone 到你的本地。
有时候,你需要用到这个省事的办法,比如 xiaolai 的仓库再次整理了 commit 。但在更多情况下,删掉自己 fork 的库,应该是你的最后选择,而不应该是首选。
和很多人一起向 xiaolai 提交 pull request,这实在是一个反复练习 merge
(中文说法:合并,或版本合并)的机会。毫不夸张地讲,版本管理是软件工程极其重要的规范,也是极其基础的必备技能。而 merge
则是版本管理中最必须也最常用的场景。
那要不然,就多练练?以下是傻瓜版操作步骤,还细心配了截图,保管你从 0 也能上手。至于原理嘛,慢慢再搞懂吧。
# merge 前的设定
step 1、进入到本地仓库的目录。
下面所有操作,如无特别说明,都是在你的本地仓库的目录下操作。比如我的本地仓库为/from-liujuanjuan-the-craft-of-selfteaching
step 2、执行命令 git remote -v
查看你的远程仓库的路径:
如果只有上面 2 行,说明你未设置 upstream
(中文叫:上游代码库)。一般情况下,设置好一次 upstream
后就无需重复设置。
step 3、执行命令 git remote add upstream https://github.com/selfteaching/the-craft-of-selfteaching.git
把 xiaolai 的仓库设置为你的 upstream
。这个命令执行后,没有任何返回信息;所以再次执行命令 git remote -v
检查是否成功。
step 4、执行命令 git status
检查本地是否有未提交的修改。如果有,则把你本地的有效修改,先从本地仓库推送到你的 github 仓库。最后再执行一次 git status
检查本地已无未提交的修改。
git add -A
或者 git add filename
git commit -m "your note"
git push origin master
git status
注 1:这一步作为新手,建议严格执行,是为了避免大量无效修改或文本冲突带来的更复杂局面。
注 2:如果你已经在 fork 后的仓库提交了大量对 xiaolai 的仓库并没有价值的修改,那么想要 pull request,还是重新回到本文最初的“最省事办法”吧。
# merge 的关键命令
以下操作紧接着上面的步骤。
step 5、执行命令 git fetch upstream
抓取 xiaolai 原仓库的更新:
step 6、执行命令 git checkout master
切换到 master 分支:
step 7、执行命令 git merge upstream/master
合并远程的 master 分支:
step 8、执行命令 git push
把本地仓库向 github 仓库(你 fork 到自己名下的仓库)推送修改
如果担心自己不小心改了哪里,可以再次执行命令 git status
检查哪些文件有变化。这个操作仅是检查,不会改变任何状态,放心用。
现在你已经解决了 fork 的仓库和原仓库版本不一致的问题。可以放心向 xiaolai 发起 pull request 了。如果以上操作你花了不少时间,而 xiaolai 的仓库 又恰好更新了。很好,一次新的练习机会来了……
# 参考链接
Github 进行 fork 后如何与原仓库同步_千淘万漉-CSDN 博客 (opens new window) fork 了别人的仓库后如何保持同步更新_shengjk1 的博客-CSDN 博客 (opens new window)