rebase
feature/login
main
merge commit
commit graph
# 當 main 有新提交,而 feature/login 尚未同步時 git checkout feature/login git rebase main # 將 feature/login 的提交重播到最新 main 之後
interactive rebase
# 假設想編輯最近 5 筆 commit git rebase -i HEAD~5 # 將不必要的 commit 合併(例如改 pick 為 squash)
假設目前的提交歷史如下:
main: A---B---C \ feature: D---E
執行:
git checkout feature git rebase main
步驟如下:
feature
結果:
main: A---B---C \ feature: D'--E'
改寫歷史
衝突處理繁瑣
若提交數量多或變更範圍大,可能需手動解決多次衝突。
若中途不想繼續,可取消操作:
git rebase --abort
需要強制推送
git push --force-with-lease
--force-with-lease
--force
git checkout main git merge feature/login
merge
假設目前歷史如下:
git checkout main git merge feature
main: A---B---C-------F \ / feature: D---E
過多的 merge commit
非線性歷史
git log --graph
合併衝突
若兩邊修改同一區塊,會發生衝突,需解決後手動完成合併:
git add . git commit
合併順序影響結果
Git Merge 與 Rebase 合併分支整理
git rebase
保持提交歷史乾淨
rebase會重播提交紀錄,使提交歷史呈現為一條「乾淨直線」。feature/login)看起來像是直接從主幹(如main)建立並開發。merge commit,使commit graph更清晰。# 當 main 有新提交,而 feature/login 尚未同步時 git checkout feature/login git rebase main # 將 feature/login 的提交重播到最新 main 之後協同開發前整理提交
interactive rebase可整理多個 commit,例如修改 commit 訊息、合併多個 commit 等。# 假設想編輯最近 5 筆 commit git rebase -i HEAD~5 # 將不必要的 commit 合併(例如改 pick 為 squash)適用於需要線性歷史的團隊
merge commit,改用rebase處理主幹合併。工作原理(實際發生什麼事)
假設目前的提交歷史如下:
執行:
步驟如下:
feature與main的共同祖先(此例為 B)。feature上的提交(D、E)。main分支的新提交(C)移動到feature。結果:
副作用與風險
改寫歷史
rebase會重寫原有 commit,造成 SHA 值變動。衝突處理繁瑣
若提交數量多或變更範圍大,可能需手動解決多次衝突。
若中途不想繼續,可取消操作:
需要強制推送
--force-with-lease而非--force,以避免覆蓋他人提交。git merge
將功能分支合併回主幹
feature/login)合併回主幹(如main),會產生一個merge commit。合併他人變更到自己分支
merge合併至自己的開發分支。保留多人協作紀錄
merge可以完整保留每個分支的歷史與合併點,便於查閱開發流程。用於 hotfix、release 合併流程
merge合併至主幹或其他維護分支。工作原理(實際發生什麼事)
假設目前歷史如下:
執行:
結果:
feature分支的新提交(D、E)整合進main。merge commit(F),記錄此次合併。副作用與風險
過多的 merge commit
merge會造成提交歷史混亂。非線性歷史
merge會讓git log --graph顯示複雜分支結構。合併衝突
若兩邊修改同一區塊,會發生衝突,需解決後手動完成合併:
合併順序影響結果
merge commitSHA,影響自動化流程。