原文地址: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