git rebase 合并历史提交的多个分支
今天因为在自己分支上提交了多个commits,合入master时被cr的同事叼了一顿:一个功能模块不要提交太多commits,导致master主线混乱。所以研究了一下如何合并多个历史提交的commits。
根据关键字搜了一下找到几篇文章,都将答案指向了git rebase -i
命令,接下来在测试的分支上实践一番:
1.git log 查看提交历史
可以看到有三次历史记录,分别是"a", "b", "c"
2.git rebase -i (from, to]
from和to分别是commits的hash值,即从from commit到to commit之间的commits(不包含from)都将被合并。这里我们要合并a->c之间的3个提交,那么输入:
git rebase -i 5c400f38b9d64c73fd173749c483433b471e64f8 ba5bb072f43de6e5e227861a9862e8793af6eaa5
可以看到提示:
p, pick <提交> = 使用提交
r, reword <提交> = 使用提交,但修改提交说明
e, edit <提交> = 使用提交,进入 shell 以便进行提交修补
s, squash <提交> = 使用提交,但融合到前一个提交
f, fixup <提交> = 类似于 "squash",但丢弃提交说明日志
x, exec <命令> = 使用 shell 运行命令(此行剩余部分)
b, break = 在此处停止(使用 'git rebase --continue' 继续变基)
d, drop <提交> = 删除提交
l, label
这里我们主要使用"pick"和"squash"来分别选择保留和丢弃提交日志。
然后保存vim后弹出下一个编辑框:
编辑合并的提交日志:
保存后,再次查看git log:
可以看到三次commits已经合并完成。
3.合并到原分支
因为rebase 后在一个临时分支上,可以直接push -f 推到远端。
`
git push -f origin xx
`
即可覆盖远端的历史commits。