git rebase
rebase 是干嘛的
rebase官方解释为变基,可以理解为移动你的分支根节点,维护一个更好的提交记录。rebase把你当前最新分支与其他分支合并时候,会把其他分支的提交记录放在我们当前分支时间线最开始的位置。也就是说,会把我们的提交记录整合在公共分支的后面。- 简单来讲,合并本地其他分支 为了不产生多余的分叉,及合并记录时可以使用
rebase。
rebase 与 merge 的差异
rebase会把你当前分支的commit放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。merge会把公共分支和你当前的commit合并在一起,形成一个新的commit提交。
应用场景
- 你刚入公司,技术leader让你以
master分支为基础,拉出一个分支进行开发需求。此时master分支提交记录为a、b。你在dev分支分别commit了2次记录为e、f,有其他同事在master分支提交了两次记录为c、d这个时候你要合并master分支代码。
- 当前分支状态节点如下图所示:

使用 git merge 进行合并操作
1 | |

结论
- 如上图所示
merge会把两个分支合并在一起,形成一个新的commit提交记录 - 我们发现
coomit提交记录是把合并的分支记录放到我们当前dev分支记录的后面 - 并且
coomit提交记录会产生分叉
使用 git rebase 进行合并操作
1 | |

结论
- 首先,我们发现目前
dev分支上面的提交记录为abcdef并没有像merge一样产生新的提交记录 - 其次
rebase master分支到dev分支,dev分支的历史记录会添加在master分支的后面 - 如图所示,历史记录成一条线,非常整洁,最后并没有像使
merge一样提交记录产生分叉
rebase 的使用业务场景
场景一
经典场景,优化本地提交记录,使其减少分叉。
场景二
连续性冲突
此时你从
master分支拉出一个dev分支来对以v1版本为基础a功能进行需求更改,由于项目经理分功能时,让你的同事也对master分支中的a功能中的某个公共页面a也进行了整改,过一会你同事改完,提交x版本并合并push到了master远程分支上面此时我们在
dev分支完成一次开发提交了v2版本产品经理过来说,需求有变更,要再做修改,然后我们又以
v2的基础上在做修改,并提交为v3版本过一会测试又提了一个需求建议。我们接着以当前dev分支
v3版本为基础做好了整改并commit一个v4版本到此我们本地假设对页面
a修改了三次。同事修改了一次,并push到了远程master上面。那么我们对master分支进行合并到时候就会产生冲突简单来讲就是。远程分支
master对文件a进行了 1 次commit,而别的分支dev对文件a进行了 3 次commit,但是本地分支dev提交的n次commit都与master分支的 1 次commit有冲突
使用 git rebase 解决冲突
1 | |
结论
- 不会因为像使用
merge时合代码时遇到冲突产生新的提交记录 - 用
merge只需要解决一次冲突即,简单粗暴,而用rebase的时候 ,需要依次解决每次的冲突,才可以提交。 - 使用
rebase提交记录不会分叉,一条线干净整洁 - 冲突解决完之后,使用
git add来标记冲突已解决,最后执行git rebase --continue继续。如果中间遇到某个补丁不需要应用,可以用下面命令忽略:git rebase --skip - 如果想回到
rebase执行之前的状态,可以执行:git rebase --abort
场景三
git 合并 commit
- 当前共有3次提交,把这3次提交合并为一次
git rebase -i HEAD~3- 进入交互模式,把除了第一行外的
pick改成s wq保存退出- 处理提交注释,默认情况下,是把三条
commit message合并为一条,当然你也可以自行修改
场景四
git 修改某次 commit 内容
- 将当前分支无关的工作状态进行暂存
1
git stash - 将 HEAD 移动到需要修改的 commit 上
1
git rebase commit-id^ --interactive - 找到需要修改的 commit ,将首行的 pick 改成 edit
- 进行修改
- 将改动文件添加到暂存
1
git add - 追加改动到提交
1
git commit –amend - 移动
HEAD回最新的commit1
git rebase –-continue
总结
- 我们发现分享 rebase 全文都是围绕 优化分支提交记录 来举例子介绍该命令,我个人觉得这也就是该命令的核心之处。
- 在学习
rebase之前我日常使用的基本都是merge导致commit记录过于混乱,自己想要哪个功能节点都要找很久的提交记录,以后会慢慢尝试在项目中使用一下。毕竟谁不想要一个整洁好看的提交记录呢
git rebase
http://mybestcheng.site/2023/02/03/devops/git_rebase/