Git 進階技巧:使用 git rebase -i 互動模式重塑 commit 記錄
Git rebase 的用途
git rebase 是一個用於重新應用或整合 Git Commit 歷史的工具,許多人對 git rebase 的印象就是它可以用來將一個分支變基合併到另一個分支。但其實,git rebase 除了用來合併分支,他還有一個很方便的功能叫做『互動模式』,它可用於調整 Commit 歷史,讓我們可以對每個 Commit 進行操作,包括:
- 修改 Commit 訊息
- 合併 Commit
- 重新排序 Commit
- 刪除不需要的 Commit。
本篇文章就是要帶大家了解如何使用 git rebase 的互動模式工具!
啟動互動模式
使用 Git Rebase 互動模式的基本指令如下:
git rebase -i <base commit>
<base commit> 用來告訴 git,我們要修改的範圍到是從 <base commit> 到 HEAD,但不包括 <base commit> 。
眼尖的你馬上就會發現,那專案中的第一個 git commit 紀錄不就永遠都修不到了嗎? 答案是:對!Git Rebase 互動模式不允許修改最早的 Commit,因為這樣做可能會破壞 Git 歷史的完整性。
假設我有一個如下的 commit 歷史紀錄,且 HEAD 停在 D 這個 Commit 紀錄點上,當我下了 git rebase -i A 指令,就代表我希望從新整理 B~D 的 commit 紀錄;如果我的 HEAD 改停在 C 這個 Commit 紀錄點上,當我同樣下了git rebase -i A 指令,則代表我希望從新整理 B~C 的 commit 紀錄。
commit 編號是一串很像亂碼的 SHA-1 字串,我們很難直接從 commit 編號看出所指的是哪一個 commit,因此在指定 commit 時我通常會使用HEAD~ 和 HEAD^,來來引用 Git Commit 歷史中相對位置的標記。
在沒有合併分支的狀況下HEAD~ 與HEAD^兩者在使用上是沒有區別的。
推薦參考這篇文章:git在回退版本时HEAD~和HEAD^的作用和区别
互動模式指令
pick
pick 指令是互動模式中最基本的操作,它的作用是選取某個 commit 保持不變。當我們在重排列提交或是進行提交整理時,pick 命令使得該 commit 原封不動地被保留在新的提交歷史中。例如,在一系列的 commits 中,如果我們只想修改其中幾個的提交訊息或順序,其他的則保持原樣,那麼就應該對這些沒有要更動的 commit 使用 pick。
reword
reword 用於修改 commit 的訊息而不改變其內容。
edit
edit 指令允許我們在提交歷史中暫停在這個 commit 上,讓我們可以更改該 commit 的內容。這包括但不限於修改文件、新增文件或刪除文件。完成修改後,我們會使用 git commit --amend 命令來修改提交,然後繼續重構過程。這是在發現提交中有錯誤或遺漏時非常有用的工具。
squash
使用 squash 指令可以將一個或多個提交合併到前一個提交中。這個指令通常用於合併多個小修改,以清理提交歷史。在互動模式下,squash 會將選定的提交與前一個提交合併,並提示你編輯一個新的提交訊息。
fixup
fixup 是 squash 的一個變體,它也會將提交合併到前一個提交,但它會自動使用前一個提交的訊息,不會提示你進行編輯。這對於那些只是簡單修正前一個提交的錯誤而不需要留下額外提交訊息的情況非常有用。
drop
drop 指令用於完全移除一個提交。如果在開發過程中產生了一些不再需要或錯誤的提交,使用 drop 可以將它們從提交歷史中清除。