前面幾天我們學過 merge
、rebase
、cherry-pick
等各種分支操作,
今天,我們要進入 Git 的「歷史編輯模式」:git rebase -i
!
這個指令可以讓你在提交之後,重新整理、修改、合併、刪除你的 commit。
簡單說,就是讓你「改寫歷史」🕰️ —— 讓專案歷史看起來更乾淨、更有條理。
git rebase -i
?在日常開發中,你可能會遇到:
fix typo
update again
really fix it this time
final fix
每次小修改都 commit,歷史亂成一團。
想要合併成一個完成版、修改訊息、刪除錯誤 commit,甚至改順序?
這時就靠 git rebase -i
了!
git rebase -i HEAD~N
i
= interactive(互動式)HEAD~N
= 從最近 N 個 commit 開始編輯pick a1 修正登入頁 bug
pick b2 改變按鈕顏色
pick c3 再次改顏色
pick d4 README 調整
每一行的 pick 都可以改成其他操作指令。
指令 | 意思 | 用途說明 |
---|---|---|
pick |
保留 | 預設動作,代表不動這筆 commit |
reword |
修改訊息 | 想修改 commit message 時用 |
edit |
停下來編輯內容 | 修改這個 commit 的內容(例如漏加某檔案) |
squash |
合併進前一個 | 把這筆 commit 合併到前一筆 |
fixup |
合併(丟掉訊息) | 合併到前一筆 commit,但丟掉訊息 |
drop |
刪除 | 完全丟掉這筆 commit |
💡 小提醒:
- squash:保留訊息,會要求你編輯合併訊息
- fixup:丟掉訊息,自動合併,不打擾你
原始歷史:
a1 修正登入頁 bug
b2 改變按鈕顏色
c3 再次改顏色
d4 README 調整
如果你在編輯器裡只寫:
pick a1 修正登入頁 bug
squash b2 改變按鈕顏色
pick d4 README 調整
pick a1 修正登入頁 bug
squash b2 改變按鈕顏色
squash c3 再次改顏色
pick d4 README 調整
結果歷史:
a1 調整登入頁樣式 ← 原本 a1 + b2 + c3 的訊息合併後
d4 README 調整
Lesson:不要漏掉 commit 行,否則就等同 drop!
忘記加檔案到舊 commit:
git rebase -i HEAD~3
編輯:
pick a1 修正登入頁 bug
edit b2 改變按鈕顏色
pick c3 再次改顏色
Git 會停在 b2:
Stopped at b2... 改變按鈕顏色
補上檔案:
git add forgot.js
git commit --amend
git rebase --continue
❓ 為什麼需要 git commit --amend?
因為 edit 模式只暫停在那筆 commit,任何修改的檔案需要透過
--amend
才能真正合併到原 commit 裡,而不是創建新的 commit。
簡單記:
不要對共用分支 rebase -i
適合用於 個人分支或 PR 合併前
隨時中止 rebase:
git rebase --abort
feature/rebase-demo
git rebase -i HEAD~4
功能 | 指令 | 用途 |
---|---|---|
合併 commit | squash / fixup | 清理歷史 |
修改訊息 | reword | 修正 commit message |
修改舊 commit 內容 | edit + --amend | 補漏檔案 |
刪除 commit | drop | 移除不該存在的提交 |
放棄 rebase | --abort | 中止流程 |
git rebase -i 是 Git 的「時間旅行工具」,掌握它,你的 commit 歷史就能乾淨漂亮、易讀可追蹤