Rebase
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。所有的提交是按照实现从早到晚排序,所谓融合到前一个提交就是融合到时间较早的提交。