1.有趣的变基例子
如下图所示,你创建了一个特性分支server,然后进行了一些提交(C3和C4),然后又从C3上创建了特性分支client,提交了C8和C9,最后你又回到了server,提交了C10。
现在你的分支提交情况如下图所示:
假设你希望将client中的修改合并到master,但是server分支中的修改不希望合并到master中,往往它们还需要经过测试,你可以使用git rebase --onto
命令。
git rebase --onto master server client
**这条命令会取出client分支上的与server分支上的共同祖先之后的修改(也就是C8,C9),然后将它们在master分支上重放一遍。**执行完成之后,分支情况如下图所示:
现在client就可以快速合并(fast forward)进master分支了。执行以下命令:
git checkout master
git merge client
结果如下:
在测试完成之后,合并server分支:如下命令:省掉了切换到server分支的步骤,可以直接将server分支上的提交rebase到master上
git rebase master server
结果如下:
同样进行快速合并server分支:
git checkout master
git merge server
现在你client和server分支上所有的提交都已经合并到了master分支中,你就可以删除这两个分支了。
git branch -d client
git branch -d server
最终提交历史的样子:
2.rebase带来的问题
如果你对已经推送到远程仓库的提交,进行了回滚,然后进行了变基操作,最后又强制提交到了远程仓库(git push --force
)。这会给其他已经拉取了你的提交的开发者带来比较头疼的问题。
如果你执行了上述操作,记得告诉其他的协作者,使用:
git pull --rebase
等价于:
git fecth
git rebase <被你强制推送的变基分支>
上述命令,在一个被变基然后强制推送的分支上再次执行变基。
这样基本能够解决变基带来的问题。