我们已经使用过git的合并(merge)功能,与之功能类似的是rebase(变基)。
开始前请记住:不要对在你的仓库外有副本的分支进行变基。
变基的实质是丢弃一些现有的提交,并且新建一些内容一样但实际上不同的提交。所以如果你的分支上的内容已经被共享,进行变基之后就会有一部分现有提交被丢弃,这会给其他用户带来麻烦与困惑。
合并是将两个分支的最新快照以及共同祖先进行三方合并,并且生成一个新的快照。比如下图是将C7、C6和C4进行三方合并。
合并是三方合并
还有另外一种方法,就是变基。变基将提取C5和C6中的补丁和修改,并且将其在C7上重新作用一次,然后生成一个新的提交。
变基会生成内容一样但实际不同的提交
如上图所示,在分支进行变基操作到后,git会进行如下操作:
找到分支和分支的共同祖先,即C4。
收集共同祖先C4到目前提交C6的所有修改和补丁,放到临时文件中。
将目前的分支指向目标基底。
在上依次应用临时文件中所有的修改和补丁。本例中为将C5和C6的修改和补丁依次应用。
生成一个新的提交,即C8。
三方合并和变基生成的新提交内容是一致的,不同的是提交历史:三方合并能够清楚地看到合并的历史,而变基只有一条串联的历史。
如果你要向他人维护的项目贡献代码,就可以将自己的修改都变基到上,推送之后,维护者只需要进行快进操作。
现在让我们实践一下。
我们创建一条分支,并且在该分支上进行两次提交。
然后回到分支,进行一次提交。
再次切换到分支。
提交历史大致如下:
如果现在从变基到,那么和中所做的修改会依次重演到。如果遇到冲突,那么会依次需要人工解决冲突。为了避免多次修改冲突,我们将和合并为一次提交:
现在执行变基到的操作:
在执行变基操作时,git提示我们有冲突,解决冲突后使用继续执行变基操作。现在请解决冲突,将文件添加到暂存区后表示该文件冲突解决完成。解决后继续执行变基操作:
git告诉我们更改已经被应用到分支。提交历史如下:
可以看到,git帮我们生成了一个新的提交,并且指向该提交。提价历史变成了一条串联的线。
最后,将快进到即可:
领取专属 10元无门槛券
私享最新 技术干货