github中fork分支和pullrequest的最佳实践
最近在参与一个国外的github开源项目,遇到自己fork了源库,一段时间之后,源库已经更新了一些内容,这样,自己fork的版本就落后于源库了。那怎么才能与源库保持同步呢?
youbute上一个教学视频讲得非常清楚:
https://www.youtube.com/watch?v=M7ZYkjOWr6g
我这里用文件记录一下,方便以后参阅和查找:
首先,假设有一个远程的repository:
https://github.com/ensime/ensime-server.git
- 我们需要在界面上,点击右上角的“Fork”,复制一个仓库到自己的github账号下。
- 然后,把自己账户下到远程仓库复制到本地:
git clone https://github.com/yangwen0228/ensime-server.git git remote add upstream https://github.com/ensime/ensime-server.git git remote -v
=>
origin https://github.com/yangwen0228/ensime-server.git (fetch) origin https://github.com/yangwen0228/ensime-server.git (push) upstream https://github.com/ensime/ensime-server.git (fetch) upstream https://github.com/ensime/ensime-server.git (push)
- pull request
毕竟,我们fork仓库就是需要做贡献。这时,我们就要做本地checkout一个新到分支,然后在新到分支里面做修改,保持fork到自己github仓库的主分支永远只用于与upstream的仓库进行同步,任何修改都只是在自己新开的临时分支中进行,进行pull request时也使用临时分支,这样当upstream中有冲突时,只需要使用本地主分支与upstream分支进行rebase同步。这样,本地的主分支永远与upstream的主分支是同步的。而此时,再把临时分支和本地主分支进行一个rebase同步,将conflict修改好,再push。
这个过程细化一下是这样的(我这里master主分支是2.0,一般情况下,默认是master):
- 检查当前的分支:
git branch
=>
* 2.0
- 创建一个新的临时分支:
git checkout -b dev git branch
=>
2.0 * dev
- 修改代码,修改完之后,需要把变化commit到这个分支里面
git status git add . git commit -m "#122: some changes."
- 将临时分支上传到github:
git push origin dev
- 在github上进行pull request
如果一切顺利,那么到这里,远程到maintainer接受了你的pull request。那么,只需要使用本地主分支与upstream分支进行rebase同步,然后删除本地的dev分支即可。
git push origin --delete dev # 删除github上的dev分支 git branch -D dev # 删除本地dev分支 git checkout 2.0 git pull --rebase upstream 2.0 git push
- 如果分支提交之后,远程upstream的分支进行了修改,这是最麻烦的。
git checkout 2.0 git pull --rebase upstream 2.0 git checkout dev git rebase 2.0
这时rebase后,有可能会有冲突,就需要手动把conflict修复掉。然后,
git add . git rebase --continue
- 再将从upstream同步后的内存更新到github上:
git push --force
由于github上的commit顺序与本地不同,如果直接push需要merge,那就整个乱了。所以,需要使用–force直接覆盖掉github的。
- 检查当前的分支: