赞
踩
git rebase在官方文档中解释为:“Reapply commits on top of another base tip”,中文意思为“在另一个基本提示之上重新提交”,简言之变基。
本文先介绍git rebase能做什么,然后如何操做,最后可以使用sourceTree工具提效这些操作。
在git中,如何将两个分支合并到一起,除了git merge命令,git rebase命令也能够做到分支合并。而rebase相比于merge,可以创造更线性的提交历史:
如分支bugfix、main为两个并行开发的分支:C2、C3为bugfix的commit节点,C4为main的commit节点,bugfix为当前分支:
merge与rebase分支合并的效果对比:
git merge main | 合并后保留了各个分支的提交路径,并且自动新增了个额外节点(C5),最新引用指向此节点 | |
git rebase main | 合并成一个提交路径,并且无新增额外节点 |
除了分支合并,git rebase也可以把提交记录明确化,将提交进行合并、剔除、修改提交记录内容等操作,代码库的提交历史将会变得明确易懂。比如现在这么多相同提交信息的提交:
先不说这些commit的提交规范,就凭这些很多的重复描述提交,一是不利于团队内的代码review,二是不利于代码回滚:紧急修复情况下,能一眼就知道应该回滚到哪个提交上吗
而git rebase可以把这些重复的合并变成一个,将提交记录清晰化,方便自己与他人
这里介绍使用命令行形式,如何来git rebase
命令行:
git rebase [<branch>]
一般我们代码开发过程中都会合并下master分支代码,使用 git rebase master 即可
命令行:
git rebase [--interactive | -i] HEAD~[n]
此命令执行后,Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。在实际使用时,所谓的 UI 窗口一般会在文本编辑器——如 Vim 中打开一个文件。
通过举例提交内容,如何将commit_5到commit_1融合成1个提交,进行示意:
执行
git rebase -i HEAD~5
(等效于 git rebase -i bc1d884 85be143 )其中bc1d884为commit_1的前一个提交(即init节点),85be143为commit_5;提交后,出现vim编辑界面:
介绍下常用命令:
将vim编辑结果如下,可以将5个提交合并成1个,(其中这里也可以调整commit顺序或选取部分commit记录,灵活度大)
- pick f73a559 commit_1
- s 1d36781 commit_2
- s a337fe0 commit_3
- s 98c5551 commit_4
- s 85be143 commit_5
保存后,自动执行,出现执行结果交互界面:
这里会把5个提交的提交的内容合并在一起,这里可以重新编辑,简洁提交内容,如简洁为:
可以看到5个合并变成了1个合并,并且内容为我们自己自定义的:
出现冲突时,git rebase会停止:
1、此时需要解决冲突:当我们冲突处理好后,执行
git add <filename>
可以把冲突文件标记为已解决,冲突文件都解决完毕后执行:
git rebase --continue
继续变基执行,完成变基
2、或者不解决冲突,直接放弃变基:
git rebase --abort
若变基的是已在远程仓库的提交记录,本地变基完后,需要执行强制推送,进行远程仓库生效:
git push origin [<local_branch>]:[remote_branch] -f
如本地、远程的分支名都为bugfix,则命令为
git push origin bugfix:bugfix -f
工欲善其事,必先利其器。
由于命令行的操作有记忆成本、理解成本,这里可以使用可视化工具sourceTree:Sourcetree | Free Git GUI for Mac and Windows
进行变基提效:
sourceTree拉取时,勾选“用变基代替合并”即可
这里可以移动提交顺序、删除、及编辑提交内容
蓝色分支为当前分支,提交记录可以看到合并成1个了
git log下也只有1条:
可以看出,用工具的变基操作会更加有效率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。