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做了什么操作呢?
- Git会将
feature1分支里面每个commit取消,临时保存为patch文件,保存在.git/rebase目录下 - 把
feature1分支更新到最新的master分支上(也就是「变基」了) - 把上面保存的
patch文件应用到feature1分支上
这样的操作后提交记录里面就不会有merge的那条记录,而且feature1是基于更新后的master,自然也就成为了最领先的分支了,可以直接push到master上。
(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来操作。
使用rebase和merge的基本原则
- 下游分支(
featrue1)更新上游分支(master)内容的时候用rebase - 上游分支合并下游分支内容的时候使用
merge