[Git] Rebase - 使用 Interactive 模式來精簡 commit 紀錄

  • 7286
  • 0
  • Git
  • 2016-05-05

避免過多 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

編輯這個 commit 的 message 文字

進入 interactive 模式後預設的指令集如下

按下 i 插入編輯修改 0dd5343 為 reword 後,輸入 :wq 存檔離開後,直接進行 rebase 

跳出調整 commit message 畫面

隨意調整一下,執行 i 插入編輯後,輸入 :wq 存檔離開後,接續進行 rebase 

順利完成

看一下線圖,確實已修改 func 3 的 commit message

使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 reword func 3 結點之 commit message 文字

 

squash

與前個 commit 合併,合併後節點的 message 以兩者合併作顯示 (可修改)

進入 interactive 模式後預設的指令集如下

按下 i 插入編輯修改 0dd5343 為 squash 後,輸入 :wq 存檔離開後,直接進行 rebase 

跳出調整兩個合併 commit message 畫面

調整完畢,執行 :wq 存檔離開後,接續進行 rebase

順利完成

看一下線圖,這個 squash commit message 就如同剛剛所設定,合併兩者 message 於此新節點。

使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 squash func 3 & func 2 結點

 

fixup

與前個 commit 合併,合併後節點的 message 以前者作顯示 (不可修改)

進入 interactive 模式後預設的指令集如下

按下 i 插入編輯改 0dd5343 為 fixup 後,輸入 :wq 存檔離開後,直接進行 rebase 

順利完成,注意這裡不像先前 squash 會跳出 commit message 更改畫面

看一下線圖(commit message 只保存 func 2 [前一個commit點] )

使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 squash func 3 & func 2 結點

 

drop

移除這個 commit 節點

進入 interactive 模式後預設的指令集如下

按下 i 插入編輯改 0dd5343 為 drop 後,輸入 :wq 存檔離開後,直接進行 rebase 

在 rebase func 4 的時候發生衝突

解決衝突 
因為原本 func 3 的 commit 已經被 drop 了,因此需要解決 func 2 (HEAD) 與 func 4 之間存在的衝突;在此由於不需要 func 3 功能,所以直接把檔案中 function 3 文字移除,模擬去除此項功能。

重新 git addgit rebase --continue 繼續進行 rebase 

重新修改 commit message 

按下 :wq 存檔離開後,在 rebase func 5 的時候又發生衝突

解決衝突

重新 git addgit rebase --continue 繼續進行 rebase

修改 commit message

順利完成

看一下線圖,func 3消失了

使用前後,有異動的 commit 都被調整過(建立新 commit 點),並且順利 drop func 3 結點

 

參考資訊

https://blog.yorkxin.org/posts/2011/07/29/git-rebase/


希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !