在前一篇我們介紹了 git merge,它能把兩個分支的工作合併在一起,保留完整的開發脈絡。但有些人會覺得這樣的歷史太「分叉」,看起來亂糟糟的。
這時候就輪到 git rebase 出場了!
git rebase 是什麼?把你所在分支的 commit,重新「嫁接」到另一個分支上,就像是 時光機,把分支的起點移動到最新的基底。
假設目前分支狀態如下:
A---B---C (main)
\
D---E (feature)
切換到你的功能分支:
git switch feature
把它 rebase 到 main:
git rebase main
執行後結果會變成:
A---B---C (main)
\
D---E (feature)
這表示 feature 分支的 commit 現在「基於」 main 的最新版本。
| 項目 | merge | rebase |
|---|---|---|
| 歷史結構 | 分叉再合流 | 直線 |
| 是否產生新 commit | 是(merge commit) | 否(改寫 commit ID) |
| 適用情境 | 團隊協作 | 個人整理分支 |
小提醒:rebase 會改寫 commit ID,不要在公開分支上使用,以免影響其他人歷史。
如果 rebase 過程中遇到衝突:
編輯檔案,解決衝突
將檔案加入暫存區:
git add <檔案>
繼續 rebase:
git rebase --continue
若想放棄 rebase,回到原本狀態:
git rebase --abort
在公開分支上使用 rebase
→ 會改寫 commit ID,造成團隊成員歷史不一致,容易混亂
忘記解決衝突就繼續 rebase
→ rebase 會中斷,必須先解決衝突
誤用 git rebase main 在錯誤分支
→ commit 會被重新套用到不想要的基底,造成歷史亂掉
以為 rebase 會自動更新遠端分支
→ rebase 只改本地分支,完成後要用 git push --force(小心!)
feature,並各自 commit 幾個檔案main 上新增 commitgit rebase main,觀察歷史變化(git log --graph --oneline)git merge main 做一次,對比差異git rebase 可將分支基底移動到最新進度。