開發過程中,在一個開發分支上進行了多次提交,最后將所有修改合並回主干。如果使用merge方式合並,會將每次commit全部合並過去,這樣主干上會出現很多提交記錄。而我們期望的是,主干上只有一條諸如"解決xx問題"的記錄。這時,可以在開發分支上將多次提交合並為一次。
在開發分支上執行
1 > git rebase -i HEAD~6
`HEAD~3`表示要合並最近的3次提交,`HEAD~6`表示要合並最近的6次提交。
會產生一個臨時的 rebase 描述文件,並進入 vim 編輯器,我們需要編譯這個文件,告訴 git 要如何 rebase。
文件開頭每一行是對一次 commit 的 rebase 描述,根據下方的提示修改各行描述信息。每行描述有三段,命令、commitId、commitMessage
其中主要的命令有如下幾個:
命令 | 提交(修改)內容 | 提交記錄 | 提交信息(commit message) |
p | 保留 | 保留 | 保留 |
s | 保留 | 保留 | 不保留 |
f | 保留 | 不保留 | 不保留 |
d | 不保留 | 不保留 | 不保留 |
pick 保留提交記錄,每出現一個 p,rebase完成之后,會有一行提交記錄。rebase不一定會把所有提交合並為一,而是出現幾個p,合並為幾個提交記錄。
squash 會保留這次提交所作的修改,但不保留提交記錄,會把這次修改壓縮合並到上個提交,就是上面的pick記錄上,同時將本次commit message添加到上個提交的后邊。
fixup 與 squash 類似,會把這次修改壓縮合並到上個提交,但是不添加commit message。
drop 會徹底丟棄這次提交,就像從來沒有過這次提交一樣,rebase完成之后,這條提交記錄沒有了,它所做的修改也沒有了。
例如,將描述文件修改為如下內容:
p ab730e5 cm1
s 5e8b46f cm2
f 9cc1a7a cm3
p 4852f69 cm4
d 5e0b320 cm5
s f07e97d cm6
保存(<Esc>:wq)之后,會執行第一次壓縮合並,對應描述文件中的前三行,壓縮完成,再次進入vim編輯模式,修改新的commit message,默認信息為"cm1 <\n> cm2",保存之后,會執行下一次壓縮合並,修改提交信息,保存。
rebase過程就完成了。