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