Git16 Rebase

Git rebase 命令学习笔记。

使用

Rebase用于把一个分支的修改合并到当前分支,这是它最主要的功能。看下面这个例子:

(1)我们从当前的master分支切除一个feature1分支,进行开发:

1
$ (master) git checkout -b feature

对应Webstorm中的操作:

(2)这时候,同事完成了一次提交,并且合并入了master分支,这时候master已经领先于feature1分支了:

对应Webstorm中的操作:

(4)这个时候,我们要同步master的改动,如果使用merge操作:

1
$ (feature1) git merger master

那么会产生一次新的用于merge的提交信息:

对应Webstorm中的操作:

这一条commit记录,我们可以认为它是无效的(也许并不是这样,看你如何看待),想要保持一份干净的commit记录,就需要用到git rebase命令了

(4)回退到merge的状态

(5)使用rebase命令:

1
$ (feature1) git reabse master

对应Webstorm中的操作:(总是搞不清楚这个操作的主客关系,Rebase Current onto Selected的意思就是将当前分支的基准(feature1)变为选择的分支(master),master是基准。

rebase做了什么操作呢?

  1. Git会将feature1分支里面每个commit取消,临时保存为patch文件,保存在.git/rebase目录下
  2. feature1分支更新到最新的master分支上(也就是「变基」了)
  3. 把上面保存的patch文件应用到feature1分支上

这样的操作后提交记录里面就不会有merge的那条记录,而且feature1是基于更新后的master,自然也就成为了最领先的分支了,可以直接pushmaster上。

(6)在reabse的过程中,也许会出现冲突conflict,这种情况Git会停止rebase,让你去解决冲突,解决完冲突用git add命令去更新这些内容。

注意,你无需执行git commit,只需要执行git rebase --continue,Git就会继续应用剩下的patch补丁文件

(7)任何情况下,都可以使用--abort来终止rebase过程,并且分支会回到rebase开始前的状态

1
$ git reabse --abort

应用场景

git rebase存在的价值是,对一个分支做「变基」的操作,最常见的应用场景是:当我们在一个过时的分支上面是,执行rebase以此同步master分支最新改动

危险性

在提交到代码到远程仓库前,记录是这样的:

提交之后分支变成了:

但是如果有同事也在feature1开发,它的分支依然基于过时的master

那么当它push到远程master就会有记录丢失,因为reabse改变了历史,应该谨慎使用。

所以,除非你可以肯定改feature1分支只有你自己操作,否则请谨慎使用。只要你的分支上需要rebase的所有commits历史还没有被push过,就可以安全的使用git rebase来操作

使用rebasemerge的基本原则

  • 下游分支(featrue1)更新上游分支(master)内容的时候用rebase
  • 上游分支合并下游分支内容的时候使用merge

参考