進階分支整合:Git Rebasing

Git 進階

Amanda Crawford-Adamo

Software and Data Engineer

Git rebase

  • 整合變更的方法
  • 不同於 merge
  • 移除合併提交,歷史更乾淨
  • 維持直線式提交圖,更清楚

Git Rebase 指令:

git rebase <branch_name>
Git 進階

Rebase 範例-前

資料清理功能分支與 main 分支的圖。功能分支在 main 的第二次提交後分岔。建立資料清理分支後,main 又多了兩次提交。

Git 進階

Rebase 流程

  1. 切換到你的 data-cleanup 功能分支。
git checkout data-cleanup
  1. main 分支 rebase 到 data-cleanup 分支上。
git rebase main
  • data-cleanup 的提交會在 main 最新提交之後重建
  • 已 rebase 的 data-cleanup 提交會有新雜湊

注意: 若發生衝突,必須手動解決。

Git 進階

Rebase 範例-後

資料清理分支已 rebase 到 main 分支上的圖。資料清理分支現在包含 main 的所有提交,而資料清理的提交接續在 main 提交之後。Main 分支未變。

Git 進階

互動式 rebase

git rebase -i <commit_hash> 

功能

  • 讓開發者對多個提交做細部調整
  • 會開啟編輯器

警告!

  • Rebase 公開分支可能干擾工作流程
    • 不要在公開分支(如 main)上使用 rebase
  • 團隊需訂定使用 rebase 的時機規則
Git 進階

互動式 rebase-前

$$

這是在編輯提交歷史前的 data-validation 分支歷史

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit
Git 進階

互動式 rebase 編輯器

以下示範在開啟的編輯器中,使用 pickfixup 指令來編輯提交歷史。

$ git rebase -i HEAD~3 
pick ghi9101 Add data validation function
fixup def5678 Fix validation bug
fixup abc1234 Optimize validation performance

# Rebase xyz1234..abc1234 onto HEAD~3(xyz1234) (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# f, fixup <commit> = like "squash", but discard this commit's log message
...
Git 進階

互動式 rebase-後

$ git log --oneline data-validation
abc1234 Optimize validation performance
def5678 Fix validation bug
ghi9101 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

$ git log --oneline data-validatoin
mno6789 Add data validation function
xyz1234 New Main Branch Commit
vwx7890 Main Branch Commit
jkl2345 Initial commit

以下提交已合併為一個:

  • abc1234
  • def5678
  • ghi9101
Git 進階

Merge 與 rebase 比較

圖片顯示三個圖:分叉的分支圖、合併後的圖,以及 rebase 後的圖

Merge

  • 保留完整歷史與分支結構
  • 維持平行開發的脈絡

Rebase

  • 在目標分支之上重放提交
  • 產生線性歷史
  • 會失去部分情境脈絡
Git 進階

何時用 merge,何時用 rebase

Merge

用於整合已完成的功能,並保留開發脈絡

Rebase

用於讓功能分支與 main 保持同步,或在合併前清理歷史

記住

  • Rebase 會改寫歷史,請謹慎使用
Git 進階

一起來練習吧!

Git 進階

Preparing Video For Download...