原文地址:http://platinhom.github.io/2016/01/02/git-combine_commit/git
有时commit多了看着会不爽.因此想合并掉一些commit. 这里是最简单的状况, 一条线下来N个commit, 合并掉末端的(没有branch出去的).github
假设有a,b,c,d四个commit, 重新到旧是a, b, c, d (也就是先d->c->b->a). 四个commit的SHA-1分别是a1,b1,c1,d1.shell
合并commit只能倒退, 就是说把a合到b(老的),顺序是abc能够合并起来成k, 最后成k, d这样.oop
# git log |head git rebase -i d1 # if fail, use git rebase --abort git push --force
git log
能够查看commit的状况, 配着head命令能够查看前几个. git log --pretty=oneline
一行一个commit更好了-i
是选择不动的commit, 比他新的commit都有被修改的可能.git rebase --abort
来忽略以前的rebase尝试,并恢复HEAD到开始的分支.git rebase --continue
就继续上次修改, 通常是rebase中间处理merge冲突后使用.git rebase --skip
是从新开始rebase并跳过如今所进行的处理.pick
就是说保留该commit, 也能够用缩写p
. (黄色)squash
, 使用该commit但合并到前一个老的commit去(经常使用). 能够用缩写s
代替 (绿色).reword
, 和pick相似, 但能够修改commit时的提交信息(中间会弹出来让你修改commit).能够用缩写r
代替 (紫红色).edit
, 使用commit, 但停下来进行修改, 可能用于merge冲突.能够用缩写e
代替.fixup
, 和squash相似, 但会舍弃commit信息. 能够用缩写f
(红色)exec
, 执行shell命令.能够用缩写x
#
. 会被自动删除.:wq
退出vi, 这时开始进行rebase操做(1/10 这样倒数). 中间会再次弹出修改文件, 此时是修改commit信息, 能够修改每次commit的信息(若是是fixup会忽略掉commit提交信息). 最后这个合并后的新commit显示的信息多是多个commit的集合(多行).不想修改或改完后直接:wq
退出vi便可.--force
覆盖掉github上的commit.git push --force
例如我上面-i d1
会修改3个commit, 保留最老最上最靠近d1的c (用reword或者pick均可以),其他a1和b1合并掉(squash或者fixup).最后生成一个新commit叫c2(就是3个合在一块儿了).因此重新到旧有c2, d1.spa