Rebase

Rebase

参考文献: https://zhuanlan.zhihu.com/p/34197548

rebase 常用于在分支之间进行合并,但是这个合并比merge要灵活很多。

经常我们会创建新的分支feature来开发新的功能,有的时候我们的新功能要依赖于master上的新特性,或者为了master方便合并分支。我们需要拉去master上最新的代码。我们可以使用

git checkout feature
git rebase master

以上的代码,会找到feature与master分支的最近公共祖先LCA结点。然后以master的最新分支为基础重新提交feature上所有LCA之后的修改。得到一个新的提交。宏观上来看,相当于换基。

git pull origin master --rebase

也可以使用这种方式来更新本地分支到最新。

另一种用法 - 压缩本地commit #

在一个分支上开发的时候,经常会有多次commit,主要是为了方便进行回滚操作,但是对于提交来说,子分支带着过多的提交记录并不是一件好事情。因此我们可以将我们的一段线性提交压缩成一个提交。



git rebase -i [start_commit_id] [end_commit_id]

上述代码将会打开一个交互模式的编辑器,罗列start至end之间的所有commit,你可以手动配置每个commit的处理方式。具体的有:

  • p, pick <提交> = 使用提交
  • r, reword <提交> = 使用提交,但修改提交说明
  • e, edit <提交> = 使用提交,进入 shell 以便进行提交修补
  • s, squash <提交> = 使用提交,但融合到前一个提交
  • f, fixup <提交> = 类似于 “squash”,但丢弃提交说明日志
  • x, exec <命令> = 使用 shell 运行命令(此行剩余部分)
  • b, break = 在此处停止(使用 ‘git rebase –continue’ 继续变基)
  • d, drop <提交> = 删除提交

我们可以按照需求定制每个commit的去留。

其中需要注意的是,start是不包含在内的,end是包含在内的。不写end默认就是当前head所指向的commit。所有的提交是按照实现从早到晚排序,所谓融合到前一个提交就是融合到时间较早的提交。