Git Rebase 妙用

Contents

前言

Git 能夠有效地幫助你為一份專案寫下對應的日誌。良好、明確的提交歷史(Commit History)能讓日後回來追蹤代碼時,事半功倍,因此筆者認為學習有效地使用 Git,尤其是 rebase 這個功能是尤為重要的。

在終端機中輸入:

git rebase --help

就能看到許多 git rebase 的用法,本文將會專注在筆者最常使用的幾個指令中,並談談如何高效地整理提交歷史。

手把手範例

  • 範例會帶讀者實際的操作 git rebase 的用法,並且所有指令設皆能複製貼上。
  • 本範例假設讀者有一定的 git 基礎。

正文開始

首先,建立我們的測試工作環境 git-rebase-demo,以下所有操作都會在此路徑下完成:

mkdir ~/git-rebase-demo && cd $_
git init

新增帶有錯別字的 A.txt 並提交(commit)A.txt:

echo 'I am fil A.' > A.txt
git add A.txt
git commit -m 'Create A.txt'

新增檔案 B.txt 並提交 B.txt:

echo 'I am file B.' > B.txt
git add B.txt
git commit -m 'Create B.txt'

查看歷史記錄:

git log --oneline
def4567 (HEAD -> main) Create B.txt
abc1234 Create A.txt

以下會用 def4567 和 abc1234 指代,讀者請自行帶換。

現在我們希望能修改 A.txt 中的錯別字,又不希望因此增加一個節點,就只是因為一時疏忽。其中一個方法是透過 git checkout abc1234 修改,而筆者將介紹一種更簡單的方式。

注意:此方法只適用新的提交節點(def4567)不依賴舊的提交節點(abc1234)的情況。

首先,修正錯別字:

sed -i 's/fil/file/' A.txt     # Linux
sed -i '' 's/fil/file/' A.txt  # macOS

關鍵一步,先不管順序對錯,在此提交修改:

git add A.txt
git commit -m 'Put anything here'

重頭戲,進步 git rebase 介面:

git rebase -i --root

你會看到

pick abc1234 Create A.txt
pick def4567 Create B.txt
pick xyz0001 Put anything here

在 vim 底下,重新調整提交順序,並將 xyz0001 的 pick 改為 fixup(也可縮寫成 f),這麼一來 xyz0001 就會和 abc1234 合併產生一個新的節點產生新的哈希值,因為修改了舊的節點,def4567 的節點也會自動生成一份新的哈希值。

pick abc1234 Create A.txt
fixup xyz0001 Put anything here
pick def4567 Create B.txt

ZZ 退出 vim,並再次查看提交歷史:

git log --oneline
6a674ea (HEAD -> main) Create B.txt
5a584af Create A.txt

可以看到我們優雅地將提交歷史變乾淨了!

結語

git rebase 的功能非常強大,已經是筆者生活與工作中不可或缺的重要工具,本文演示了一個簡單的例子,除了 fixup 外,其它還有像 reword, edit 等等方便的功能,就暫時不在這篇文章中提及了!