共计 1411 个字符,预计需要花费 4 分钟才能阅读完成。
git rebase
对于初学者,应该并不常用,虽然自己已经使用了 git 两年时间了,还是第一次了解到有这个东西,但这并不能说明其不重要,相反,git rebase 是相当重要的一个知识点,在上周看的一篇博客中更是把这个列为必会的一个知识点(也是我学习这个东西的原因)。
它是干嘛的?
Rebase,中文世界里常被称为「变基」,即改变基础。
它主要用在两个地方:
-
合并多次提交纪录
-
分支合并
合并多次提交记录
因为各种各样的原因,我们会有一些没有什么意义的 commit 信息,比如合并分支,修复单元测试等等
这些信息,审核代码的人并不关心,而且影响美观,当然,这些东西提交上去也没什么大坏处,但可以更好,为什么不做呢?
这时我们就可以通过 rebase 命令来删除多余的提交记录:
git rebase -i HEAD~4 #HEAD~4 代表修改最近的四次提交
这几个命令需要注意一下:
- p, pick = use commit(即使用这个 commit)
- r, reword = use commit, but edit the commit message(改变 commit 的信息)
- s, squash = use commit, but meld into previous commit(融入先前的 commit)
- f, fixup = like“squash”, but discard this commit’s log message(放弃此提交的日志消息)
- d, drop = remove commit(移除 commit)
把 2,3 行的消息进行更改,pick
换成 s
,之后使用git log
查看提交信息,可以看到 2,3,4 合并成了一个
用一个图片表示一下上述过程
error: cannot ‘squash’ without a previous commit
保存的时候你可能会遇到这个错误。
注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。
分支合并
通过 git rebase master
, 分支 1
变成了基于 commit2 的分支。
当然,上述过程你完全可以通过 git merge
来实现,但这不就回到上面那个需要解决的问题——污染了提交。
git 干了嘛
git 在这个过程干了什么呢?
首先,git 会把
分支 1
里面的每个 commit 取消掉;
其次,把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
然后,把分支 1
分支更新到最新的master
分支;
最后,把上面保存的 patch 文件应用到分支 1
分支上;
遇到冲突怎么办
在这种情况,git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容。
注意,你无需执行 git-commit,只要执行 continue
git rebase --continue
在任何时候,我们都可以用 –abort 参数来终止 rebase 的行动,并且分支会回到 rebase 开始前的状态。(
git rebase —abort
)
若是对上面所说的感觉不明白,可以跟着这篇文章的视频,自己操作一下,相信在这之后你就能明白了。
需要注意的是
git rebase
有时并不安全。
一条 rebase 黄金法则:绝不要在公共的分支上使用它。
git rebase
会重写历史,一定只能在你自己的分支上使用它。
假如,你和同事都在 分支 1
上开发
你进行了 git rebase
并提交了远程分支。
而同事的仍然没变,那么当他 pull 远程 master 的时候,就会丢失提交纪录。
参考文章
彻底搞懂 Git-Rebase
骚年,听说你写代码从来不用 git rebase [视频]