Git详解——不喜欢 merge 的分叉?用 rebase

Posted ys951207

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git详解——不喜欢 merge 的分叉?用 rebase相关的知识,希望对你有一定的参考价值。

有些人不喜欢 merge ,因为在 merge 之后, commit 历史就会出现分叉,这种分叉再汇合的结构会 让有些人觉得混乱而难以管理。如果你不希望 commit 历史出现分叉,可以用 rebase 来代替 merge

 

rebase——在新位置重新提交

rebase ,又是一个中国人看不懂的词。这个词的意思,你如果查一下的话:

技术分享图片

 

其实这个翻译还是比较准确的。 rebase 的意思是,给你的 commit 序列重新设置基础点(也就是父 commit )。展开来说就是,把你指定的 commit 以及它所在的 commit 串,以指定的目标 commit 为基础,依次重新提交一次。例如下面这个 merge

git merge branch1

技术分享图片

 

如果把 merge 换成 rebase ,可以这样操作: 

git checkout branch1
git rebase master

技术分享图片

 

可以看出,通过 rebase56 两条 commit s 把基础点从 2 换成了 4 。通过这样的方式, 就让本来分叉了的提交历史重新回到了一条线。这种「重新设置基础点」的操作,就是 rebase 的含义。

 

另外,在 rebase 之后,记得切回 mastermerge 一下,把 master 移到最新的 commit : 

git checkout master
git merge branch1

 

技术分享图片

 

为什么要从 branch1rebase ,然后再切回 mastermerge 一下这么麻烦,而不是直接在 master 上执行 rebase

从图中可以看出, rebase 后的 commit 虽然内容和 rebase 之前相同,但它们已经是不同 的 commit s 了。如果直接从 master 执行 rebase 的话,就会是下面这样:

技术分享图片

 

这就导致 master 上之前的两个最新 commit 被剔除了。如果这两个 commit 之前已经在中央仓库存在,这就会导致没法 push 了:

 

技术分享图片

 

所以,为了避免和远端仓库发生冲突,一般不要从 master 向其他 branch 执行 rebase 操 作。而如果是 master 以外的 branch 之间的 rebase (比如 branch1branch2 之间),就不必这么多费一步,直接 rebase 就好。

 

小结

本节介绍的是 rebase 指令,它可以改变 commit 序列的基础点。它的使用方式很简单:

git rebase 目标基础点

 

需要说明的是, rebase 是站在需要被 rebasecommit 上进行操作,这点和 merge 是不同 的。

以上是关于Git详解——不喜欢 merge 的分叉?用 rebase的主要内容,如果未能解决你的问题,请参考以下文章

Git的branch操作详解

“git merge --squash”的正确用例是啥?

Git详解——merge

git rebase

git branch、fork、fetch、merge、rebase 和 clone 有啥区别?

git push 出现 you are not allowed to upload merges 错误提示