避免過多 commit 紀錄造成線圖繁雜
透過 Rebase Interactive Mode 來將 commit log 進行精簡
前言
在開發的過程中,會隨著各種原因將代碼提交至 local repository 中,並且在完成最終功能的開發後,會將 local 的變動 push 到 remote repository 中;此時為了避免過多無特別意義的 commit 紀錄造成線圖的繁雜,因此會透過各種方式來將 commit log 進行精簡,其中處理方式多為 git reset 或 git rebase 來達成,想知道 reset 處理方式可以參考 [Git] Reset - mixed, hard and soft 內容 ,而此篇文章將針對 rebase 方式進行說明。
環境
- git v2.8.1.windows.1
- SourceTree v1.3.8.0
實際演練
筆者先隨意建立六筆 commit 紀錄,以此模擬開發的提交過程,而在完成 func 1 ~ func 5 功能後發現建立了過多提交紀錄,因此想要透過 rebase 來調整這些提交紀錄;調整的原因有可能是因為 commit message 打錯,或者是想要合併一些提交紀錄,甚至想要直接移除某次的 commit 紀錄(包括異動內容)等,以下透過簡單範例來實際體驗看看。
執行 git rebase -i 069f5ac
來進入 rebase 的 interactive 模式,其中 069f5ac 是這個分支最早 commit 節點,表示我們想要調整這個節點(069f5ac)開始至HEAD中間的提交紀錄。
執行指令後,在上方會列出所有需要 rebase 的 commit 節點,我們可以依照需求調整個節點前方的指令(command),而各種指令的說明如下方黃色區塊所示。調整完上方紅色區塊指令後,就可以輸入 :wq
存檔離開編輯模式,接著就會依照順序(由上至下)逐一執行各列指令來達成 rebase 目的。以下說明。
我們有以下幾種常見選擇可以調整
- pick: 只接使用這個commit,不做任何調整
- reword: 使用這個commit,只調整 commit message
- squash: 使用這個commit融入前一個commit中,合併兩個commit message來表示(可以修改)
- fixup: 使用這個commit融入前一個commit中,使用前一個commit的message來表示(不可修改)
- drop: 直接移除這個commit
以下筆者將透過幾個簡單的例子試試比較常用的功能。
reword
進入 interactive 模式後預設的指令集如下
按下 i
插入編輯修改 0dd5343 為 reword 後,輸入 :wq
存檔離開後,直接進行 rebase
跳出調整 commit message 畫面
隨意調整一下,執行 i
插入編輯後,輸入 :wq
存檔離開後,接續進行 rebase
順利完成
看一下線圖,確實已修改 func 3 的 commit message
使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 reword func 3 結點之 commit message 文字
squash
進入 interactive 模式後預設的指令集如下
按下 i
插入編輯修改 0dd5343 為 squash 後,輸入 :wq
存檔離開後,直接進行 rebase
跳出調整兩個合併 commit message 畫面
調整完畢,執行 :wq
存檔離開後,接續進行 rebase
順利完成
看一下線圖,這個 squash commit message 就如同剛剛所設定,合併兩者 message 於此新節點。
使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 squash func 3 & func 2 結點
fixup
進入 interactive 模式後預設的指令集如下
按下 i
插入編輯改 0dd5343 為 fixup 後,輸入 :wq
存檔離開後,直接進行 rebase
順利完成,注意這裡不像先前 squash 會跳出 commit message 更改畫面
看一下線圖(commit message 只保存 func 2 [前一個commit點] )
使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 squash func 3 & func 2 結點
drop
進入 interactive 模式後預設的指令集如下
按下 i
插入編輯改 0dd5343 為 drop 後,輸入 :wq
存檔離開後,直接進行 rebase
在 rebase func 4 的時候發生衝突
解決衝突
因為原本 func 3 的 commit 已經被 drop 了,因此需要解決 func 2 (HEAD) 與 func 4 之間存在的衝突;在此由於不需要 func 3 功能,所以直接把檔案中 function 3 文字移除,模擬去除此項功能。
重新 git add
與 git rebase --continue
繼續進行 rebase
重新修改 commit message
按下 :wq
存檔離開後,在 rebase func 5 的時候又發生衝突
解決衝突
重新 git add
與 git rebase --continue
繼續進行 rebase
修改 commit message
順利完成
看一下線圖,func 3消失了
使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 drop func 3 結點
參考資訊
https://blog.yorkxin.org/posts/2011/07/29/git-rebase/
希望此篇文章可以幫助到需要的人
若內容有誤或有其他建議請不吝留言給筆者喔 !