iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
Modern Web

Git 起來!每日一招學起來系列 第 25

Day 25:git rebase -i —— 改寫歷史的時光編輯器

  • 分享至 

  • xImage
  •  

前面幾天我們學過 mergerebasecherry-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 開始編輯
  • 執行後,Git 會打開編輯器,列出 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:丟掉訊息,自動合併,不打擾你

範例 1:合併多個 commit

原始歷史:

a1 修正登入頁 bug
b2 改變按鈕顏色
c3 再次改顏色
d4 README 調整

錯誤示範

如果你在編輯器裡只寫:

pick a1 修正登入頁 bug
squash b2 改變按鈕顏色
pick d4 README 調整
  • c3 再次改顏色 沒有列出 pick / squash / fixup
  • Git 會把它視為「不被選中」,等同於 drop
  • 所以 c3 直接消失,不會保留在歷史中

正確做法:明確告訴 Git 你的意圖

pick a1 修正登入頁 bug
squash b2 改變按鈕顏色
squash c3 再次改顏色
pick d4 README 調整

結果歷史:

a1 調整登入頁樣式   ← 原本 a1 + b2 + c3 的訊息合併後
d4 README 調整
  • a1/squash b2 c3 → 合併成一個 commit
  • 訊息可以整理成「調整登入頁樣式」

Lesson:不要漏掉 commit 行,否則就等同 drop!


範例 2:修改舊 commit 內容

忘記加檔案到舊 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。


squash vs fixup 差異

  • squash:合併 commit 並保留訊息,會打開編輯器讓你整理訊息
  • fixup:合併 commit 並丟掉訊息,自動使用前一個 commit 的訊息

簡單記:

  • 想保留訊息 → squash
  • 想自動合併、不改訊息 → fixup

注意事項

  1. 不要對共用分支 rebase -i

    • 會改變 commit SHA,可能造成他人衝突
  2. 適合用於 個人分支或 PR 合併前

  3. 隨時中止 rebase:

    git rebase --abort
    

小挑戰 💪

  1. 建立分支 feature/rebase-demo
  2. 新增 4 次 commit
  3. 使用 git rebase -i HEAD~4
    • 合併其中兩筆(squash 或 fixup)
    • 修改訊息(reword)
  4. 檢查歷史,確認乾淨漂亮

小結

功能 指令 用途
合併 commit squash / fixup 清理歷史
修改訊息 reword 修正 commit message
修改舊 commit 內容 edit + --amend 補漏檔案
刪除 commit drop 移除不該存在的提交
放棄 rebase --abort 中止流程

git rebase -i 是 Git 的「時間旅行工具」,掌握它,你的 commit 歷史就能乾淨漂亮、易讀可追蹤


上一篇
Day 24:git cherry-pick —— 挑選你想要的歷史
系列文
Git 起來!每日一招學起來25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言