步驟 1: 選擇你的起始提交
git rebase --interactive HEAD~[N]?命令的缺點就是你必須一個一個的數(shù)出準確的提交次數(shù)灸叼。幸運的是這里還有另一種方式:
git rebase --interactive [commit-hash]
[commit-hash]?就是你要壓縮的提交范圍的起始提交之前的一次提交的 hash神汹。所以在我的示例中的命令就是:
git rebase --interactive 6394dc
6394dc?是?Feature Y庆捺。你可以將這個命令理解為:
對?[commit-hash]?之上的所有提交進行合并。
步驟 2: 選擇與壓縮
這時你的編輯器會有彈窗屁魏,顯示出你想要合并的提交列表滔以。注意,一開始可能會感覺有點看不明白氓拼,因為是按反序排列的你画,舊的提交顯示在頂部。我通過?--- older commit?和?--- newer commit?進行了說明桃漾,在編輯器的窗口中不會顯示說明坏匪。
pick d94e78 Prepare the workbench for feature Z? ? --- older commit
pick 4e9baa Cool implementation
pick afb581 Fix this and that?
pick 643d0e Code cleanup
pick 87871a I'm ready!
pick 0c3317 Whoops, not yet...
pick 871adf OK, feature Z is fully implemented? ? ? --- newer commit
[...]
在提交列表的底部有一個簡短的注釋(示例中忽略了),提示了所有的操作選項撬统。你可以在交互式 rebase 中進行各種操作适滓,我們現(xiàn)在只進行一些基本的操作。我們的任務(wù)是將所有的提交注釋為?squashable恋追,除了第一個(最早的)提交:它將被用作起始點凭迹。
你可以通過將任務(wù)?pick?修改為?squash?(或者簡寫為?s?,評論中有提示)來將提交標記為 squashable 苦囱。最后的結(jié)果就是:
pick d94e78 Prepare the workbench for feature Z? ? --- older commit
s 4e9baa Cool implementation
s afb581 Fix this and that?
s 643d0e Code cleanup
s 87871a I'm ready!
s 0c3317 Whoops, not yet...
s 871adf OK, feature Z is fully implemented? ? ? --- newer commit
[...]
保存文件嗅绸,關(guān)閉編輯器。
步驟 3: 創(chuàng)建新的提交
你剛剛告訴了 Git 將全部的 7 次提交合并到列表的第一個提交中∷和現(xiàn)在要給它添加注釋:你的編輯器會再次彈出一個帶有默認消息的窗口鱼鸠,內(nèi)容是壓縮的所有提交的注釋。
你可以保留默認的提交注釋喉刘,這樣最終的提交信息將會是這些臨時提交的注釋列表瞧柔,如下所示:
Prepare the workbench for feature Z
Cool implementation
Fix this and that?
Code cleanup
I'm ready!
Whoops, not yet...
OK, feature Z is fully implemented
通常我不喜歡保留這些信息,所以我會清楚默認消息睦裳,使用一些自定義注釋造锅,例如?Implemented feature Z。