乐趣区

git-进阶git-rebase

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 [视频]

退出移动版