git rebase
rebase这个命令在官方的翻译中意思是:变基。
额,怎么说都有点怪是不是,最后查了几个词典,我觉得把rebase翻译为:重定基底
重定基底有两词语组成:
- 重定:动词,重新确定的意思
- 基底:名词,就是依据,把某种事物作为依托或根据,在git中,这个依据的事物就是提交历史
合起来就是:重新确定所依据的提交历史。
为什么要重新确定依据的提交 历史呢?这得先说一下 merge是如何工作的,
git merge
merge是我们常用的合并分支的命令:
假如开发中:分叉到两个不同的分支,右各自有新的提交:当我们使用merge命令合并时,它会把两个分支的最新提交历史(C3
和 C4
)和这个两个分支的最近的祖先(C2
)进行三方合并,合并的结果就是生成一个新的提交历史。
在将三方合并的时候,总是需要以一个提交历史作为依据的,在这个提交历史的基础上增加其他两个的修改,merge上使用的就是这个两个分支的最近的祖先(C2
)作为依据。
git rebase
rebase同样是通过合并来整合分叉的历史,唯一的不同就是,合并时所依据的提交历史不同(基),它是直接拿两个分支的最新提交历史(C3
和 C4
)中的一个作为依据(即基),比如以C3
为基础,提取在 C4
中引入的补丁和修改,然后在 C3
的基础上应用一次。
这个过程就相当于改变C4
的基底为C3
,并将C4
上的修改依序应用于C3
上,生成新的C4'
, 这个过程就改变了C4
的基底,也就是所谓的变基。
将 C4
中的修改变基到 C3
上
git rebase [basebranch][topicbranch]
, 以basebranch为基,将topicbranch的修改应用于basebranch上。
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
这时experiment分支的提交历史就已经改变了,master分支在experiment分支之后。
现在回到 master
分支,进行一次快进合并。
$ git checkout master
$ git merge experiment
此时,C4'
指向的快照就和上面使用 merge
命令的例子中 C5
指向的快照一模一样了。
这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。
区别
无论是通过变基,还是通过三方合并,最后所生成的结果是一样的,只是他们所生成体提交历史不同。
变基:将一个分支的一系列的提交按顺序应用到另一分支上。
三方合并:把两方的最后提交合并在一起。
变基操作的实际是:丢弃一个分支上现有的提交,在另一个分支上新建这些内容但实际上不同的提交。
git rebase使用:https://www.jianshu.com/p/f7ed3dd0d2d8