今天因為在自己分支上提交了多個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。