github中fork分支和pullrequest的最佳实践

github中fork分支和pullrequest的最佳实践

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):

    1. 检查当前的分支:
      git branch
      

      =>

      * 2.0
      
    2. 创建一个新的临时分支:
      git checkout -b dev
      git branch
      

      =>

      2.0
      * dev
      
    3. 修改代码,修改完之后,需要把变化commit到这个分支里面
      git status
      git add .
      git commit -m "#122: some changes."
      
    4. 将临时分支上传到github:
      git push origin dev
      
    5. 在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
      
    6. 如果分支提交之后,远程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
      
    7. 再将从upstream同步后的内存更新到github上:
      git push --force
      

      由于github上的commit顺序与本地不同,如果直接push需要merge,那就整个乱了。所以,需要使用–force直接覆盖掉github的。

Date: 2017-04-22 10:21

Author: WEN YANG

Created: 2017-07-29 Sat 20:34

Emacs 25.2.1 (Org mode 8.2.10)

Validate

posted @ 2017-04-22 12:38  yangwen0228  阅读(2766)  评论(0编辑  收藏  举报