1. 使用场景
在日常开发中,我们从主分支上拉出来一个feature分支,并在feature分支上进行了若干提交(c2,c3,c4),同时,master分支上其他的开发人员也push了新的提交(c5, c6)。feature分支开发完成,发起merge request请求合并到主分支,就会产生冲突。这时候,解决冲突有两种方式,一种是将master分支merger到feature分支上,合并时解决冲突,这样做feature分支上会有一个合并提交,包括为解决冲突所做的修改。另外一种是将feature分支rebase到master分支的最新提交,并在rebase过程中解决冲突。区别是,merge会引入新提交。这里我们讲rebase。
2. git rebase 原理
当在feature分支上执行git rebase master时,将从双方共同祖先(C1)开始,将feature分支上每个提交对应的变更暂存起来,然后以master分支最后一个提交(C6)为新起点,将暂存的变更按顺序一一还原成新提交。
3. 基本命令使用方法
- 执行前先把master分支和feature分支更新到最新。
- 切换到feature分支:> 执行 git rebase master
如果没有冲突会提示成功,如图:
- 先git pull 再git push,把暂存的变更搬移到新基线上:
注意: 如果不git pull直接git push会报错,并提示在push之前要先pull:
4. 交互式rebase
交互式rebase被广泛应用在不希望重设基线,但又需要调整历史提交记录的场景中,
重排、压缩、拆分、丢弃。
git rebase -i master
唤起编辑器并加载预加载一个文档,文档正文部分是to-do list,列出的是提交的历史记录。每个提交默认是pick指令,通过修改响应的指令实现对历史提交记录的重排、压缩、拆分、丢弃。
常用的命令:
r: 选用该提交,同时让修改提交信息。
s: 选用该提交,但将该提交的变更压缩到上一个提交中,不单独生成提交。
d: 丢弃该提交及其相关的变更。
5. 举例说明
1)把C3的变更调整到C2的前面:
2)合并C2和C3的变更:
3)丢弃C3的变更:
4)综合使用场景,修改提交记录。
例如,在feature分支上发现对最近的6个提交不太满意,需要调整顺序,删除,合并等。
使用命令: git rebase -i HEAD~6 对前6个提交进行编辑。
tips:
git merge 和git rebase不同: