git rebase 原理图解
1、什么是变基?
变基,顾名思义,改变基地。如下图示,有两个分支master和feature,其中feature是在提交点B处从master上拉出的新分支。之后,master上有一个新提交M,而feature上有两个新提交C和D。
feature分支是基于master分支的B拉出来的新分支,所以feature的基底是B。而master在B之后有新的提交,rebase变基就相当于此时要用master上新的提交来作为feature分支的新基底。如下所示:
2、变基如何操作呢?
先切换到feature分支上,执行rebase命令,相当于把master分支合并到feature分支,如下所示:
git checkout feature
git rebase master
此时的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动。
3、变基的底层原理是什么?
当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。
结合上述例子可以看出,当在feature分支上执行git rebase master
时,git会执行三个步骤:
第一步:git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交。
第二步:git将feature分支指向master分支的最新提交上,也就是M。
第三步:git把提取的C和D接到M后面,但这个过程是删除原来的C和D,生成新的C’和D’,它们的提交内容一样,但commit id不同。feature最后也是指向D’。
需要注意的是:如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录。
4、变基的好处是什么?
从上图可以看出来,提交记录会比较简洁,不存在分叉,但有个缺点就是rebase以后就不知道当前分支最早是从哪个分支拉出来的。
5、变基的应用场景是什么?
对于上文中提到的两个分支master和feature的使用场景来说,使用变基有好处也有不好之处,甚至坏处大于好处,所以使用变基有点得不偿失。但是,对于下面这种情况,则完全没有什么坏处,故此推荐在下面这种场景下使用变基:
在同一个feature分支上,有两个人分别在使用,此时使用变基可以将提交记录变得简单明了,没有那么多分叉。A工程师提交代码之后,B工程师应该 git commit
本地代码,然后执行 git pull --rebase
实现变基合并,最后执行 git push
代码推送到远端。
6、变基发生冲突如何解决?
rebase变基分支发生冲突的时候,我们需要执行以下几个步骤。同解决merge冲突类似,但是也有不同之处:
第一步:手动解决冲突。
第二步:git add 提交修改。
第三步:git rebase --continue 继续合并。
需要注意的是,最后一步的命令是:git rebase --continue
,而不是 git commit
。
7、本文小结
在本文中主要讲述了git rebase 变基的原理,还有变基的两种应用场景:两个分支的变基,以及同分支的不同提交记录的变基。变基有好处也有不足之处,要根据场景而定。最后,本文还介绍了一下变基发生冲突的处理方案。本文全面系统化地介绍了git rebase 变基的原理和使用,比网上其他地方的内容更全面。