git rebase的一点理解

git rebase

rebase这个命令在官方的翻译中意思是:变基。

额,怎么说都有点怪是不是,最后查了几个词典,我觉得把rebase翻译为:重定基底

重定基底有两词语组成:

  • 重定:动词,重新确定的意思
  • 基底:名词,就是依据,把某种事物作为依托或根据,在git中,这个依据的事物就是提交历史

合起来就是:重新确定所依据的提交历史。

为什么要重新确定依据的提交 历史呢?这得先说一下 merge是如何工作的,

git merge

merge是我们常用的合并分支的命令:

假如开发中:分叉到两个不同的分支,右各自有新的提交:
分叉的提交历史。

当我们使用merge命令合并时,它会把两个分支的最新提交历史(C3C4)和这个两个分支的最近的祖先(C2)进行三方合并,合并的结果就是生成一个新的提交历史。

通过合并操作来整合分叉了的历史。

在将三方合并的时候,总是需要以一个提交历史作为依据的,在这个提交历史的基础上增加其他两个的修改,merge上使用的就是这个两个分支的最近的祖先(C2)作为依据。

git rebase

rebase同样是通过合并来整合分叉的历史,唯一的不同就是,合并时所依据的提交历史不同(基),它是直接拿两个分支的最新提交历史(C3C4)中的一个作为依据(即基),比如以C3为基础,提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。

这个过程就相当于改变C4的基底为C3,并将C4上的修改依序应用于C3 上,生成新的C4', 这个过程就改变了C4的基底,也就是所谓的变基

将 `C4` 中的修改变基到 `C3` 上。

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
master 分支的快进合并。

此时,C4' 指向的快照就和上面使用 merge 命令的例子中 C5 指向的快照一模一样了。

这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。

区别

无论是通过变基,还是通过三方合并,最后所生成的结果是一样的,只是他们所生成体提交历史不同。

变基:将一个分支的一系列的提交按顺序应用到另一分支上。

三方合并:把两方的最后提交合并在一起。

变基操作的实际是:丢弃一个分支上现有的提交,在另一个分支上新建这些内容但实际上不同的提交。

git rebase使用:https://www.jianshu.com/p/f7ed3dd0d2d8

你可能感兴趣的:(git rebase的一点理解)