git变基

我们已经使用过git的合并(merge)功能,与之功能类似的是rebase(变基)。

开始前请记住:不要对在你的仓库外有副本的分支进行变基。

变基的实质是丢弃一些现有的提交,并且新建一些内容一样但实际上不同的提交。所以如果你的分支上的内容已经被共享,进行变基之后就会有一部分现有提交被丢弃,这会给其他用户带来麻烦与困惑。

合并是将两个分支的最新快照以及共同祖先进行三方合并,并且生成一个新的快照。比如下图是将C7、C6和C4进行三方合并。

合并是三方合并

还有另外一种方法,就是变基。变基将提取C5和C6中的补丁和修改,并且将其在C7上重新作用一次,然后生成一个新的提交。

变基会生成内容一样但实际不同的提交

如上图所示,在分支进行变基操作到后,git会进行如下操作:

找到分支和分支的共同祖先,即C4。

收集共同祖先C4到目前提交C6的所有修改和补丁,放到临时文件中。

将目前的分支指向目标基底。

在上依次应用临时文件中所有的修改和补丁。本例中为将C5和C6的修改和补丁依次应用。

生成一个新的提交,即C8。

三方合并和变基生成的新提交内容是一致的,不同的是提交历史:三方合并能够清楚地看到合并的历史,而变基只有一条串联的历史。

如果你要向他人维护的项目贡献代码,就可以将自己的修改都变基到上,推送之后,维护者只需要进行快进操作。

现在让我们实践一下。

我们创建一条分支,并且在该分支上进行两次提交。

然后回到分支,进行一次提交。

再次切换到分支。

提交历史大致如下:

如果现在从变基到,那么和中所做的修改会依次重演到。如果遇到冲突,那么会依次需要人工解决冲突。为了避免多次修改冲突,我们将和合并为一次提交:

现在执行变基到的操作:

在执行变基操作时,git提示我们有冲突,解决冲突后使用继续执行变基操作。现在请解决冲突,将文件添加到暂存区后表示该文件冲突解决完成。解决后继续执行变基操作:

git告诉我们更改已经被应用到分支。提交历史如下:

可以看到,git帮我们生成了一个新的提交,并且指向该提交。提价历史变成了一条串联的线。

最后,将快进到即可:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180114G0I13G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券