【Git】Fork别人代码后仍能同时保持与原作者同步更新

Posted on 18-05-01

1. 从自己fork之后的版本库clone

$ git clone -o chucklu https://github.com/chucklu/Hearthstone-Deck-Tracker.git

参数说明:

-o

Instead of using the remote name origin to keep track of the upstream repository, use .

2. 再将别人的版本库 git remote add

$ git remote add epix37 https://github.com/Epix37/Hearthstone-Deck-Tracker.git
$ git remote -v

chucklu https://github.com/chucklu/Hearthstone-Deck-Tracker.git (fetch)
chucklu https://github.com/chucklu/Hearthstone-Deck-Tracker.git (push)
epix37 https://github.com/Epix37/Hearthstone-Deck-Tracker.git (fetch)
epix37 https://github.com/Epix37/Hearthstone-Deck-Tracker.git (push)

3. 本地分支和远端分支映射处理

参考: 如何将本地分支和远端分支进行映射

$ git branch

chucklu_master
*master
  • chucklu_master 分支用来对应自己远端的 master 分支
  • master 分支用来对应原作者的 master 分支

3.1 切换到master分支

$ git checkout master

首先确保目前处于master分支,上面的git branch就是查看本地分支的命令,master前面的 * 表示当前分支是master分支

3.2 同步原作者的代码

$ git pull

3.3 切换到chucklu_master分支

$ git checkout chucklu_master

3.4 变基或者合并

$ git rebase master
$ git merge master

3.5 推送代码到自己的版本库

$ git push chucklu HEAD:master

或者

$ git push chucklu chucklu_master:master
  • 假如自己 fork 版本库之后,已经在某个分支上进行了修改的话。那么 rebase 就不适用,需要使用 cherry-pick 来处理。
  • 为了确保 cherry-pick 之后的代码,确实是自己所期望的,那么只需要对比一次,自己的分支的最后一次提交和原作者的分支的最后一次提交,看看差异,是否是自己额外修改导致的,使用 tortoisegit –> diff with previous version

  • 使用 cherry-pick 的注意事项,如果其中有某一个 commit 是合并导致的,那么这个 commit 就不需要进行cherry-pick
  • 另外网上看到的一篇文章,貌似cherry-pick不推荐使用: # Why cherry-picking should not be part of a normal git workflow
  • 如果你仅仅是同步原作者的master分支,而不需要进行合并操作的话,本地仅有一个分支也够用了,需要添加2个remote

扩展:

重新命名远端:

$ git remote rename oldname newname

参考