認識合併類型

Git 進階

Amanda Crawford-Adamo

Software and Data Engineer

我是 Amanda

Amanda 的照片

Git 進階

什麼是 git merge?

Git 合併指令:

git merge
  • 將一個分支的變更合入另一個分支
  • 找出兩個分支的共同基底
  • 可使用不同的合併策略

兩條路匯合,兩台車併入同一路

Git 進階

快轉合併

什麼是快轉合併?

  • 保持簡單直線的歷史
  • 適合存活期短且變更單純的分支

$$

不適用時機

  • 需要保留分支歷史
  • 長期分支上的複雜功能開發
  • 分支間發生衝突—快轉會立即失敗!
Git 進階

快轉合併(前)

一張顯示 main 與 feature 兩個分支的圖。main 有兩個提交。feature 在 main 最新提交之後分岔,並在其分支上多一個提交。

Git 進階

快轉合併語法

Git 快轉合併預設

git checkout main
git merge feature_branch

強制使用快轉合併

git merge <branch> --ff-only

範例

git checkout main
git merge feature_branch --ff-only
Git 進階

快轉合併(後)

一張顯示 main 與 feature 兩個分支的圖。main 有三個提交。feature 在 main 第二個提交後分岔,並在其分支上多一個提交。main 的第三個提交是 feature 最新提交的拷貝。

Git 進階

遞迴合併

什麼是遞迴合併?

  • 產生一個有兩個父提交的合併提交
  • 保留完整的專案歷史
  • 適合長期分支
  • 維持分支結構

$$

不適用時機

  • 想維持簡單、線性的歷史
  • 變更快速且瑣碎時
Git 進階

遞迴合併(前)

一張顯示 main 與 feature 兩個分支的圖。main 有三個提交。feature 在 main 第一個提交後分岔,並在其分支上多兩個提交。

Git 進階

遞迴合併語法

遞迴合併指令:

git merge --no-ff <branch>

範例

$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

$ git merge --no-ff feature_branch
Merge made by the 'recursive' strategy.
...
Git 進階

遞迴合併(後)

一張顯示 main 與 feature 兩個分支的圖。main 有六個提交。feature 在 main 最新提交之後分岔,並在其分支上多兩個提交。main 分支的六個提交交錯包含 main 與 feature 的提交。main 的最新提交是合併提交物件,具有兩個父:feature 的最新提交與 main 先前的最新提交。

Git 進階

重點整理

  • 快轉合併讓歷史保持簡潔、線性
  • 遞迴合併保留歷史脈絡
  • 複雜開發情境較適合遞迴合併

快轉合併指令

git merge <branch_name> # 預設指令
git merge --ff-only <branch_name> # 強制快轉合併

遞迴合併指令

git merge --no-ff <branch_name>
Git 進階

一起來練習吧!

Git 進階

Preparing Video For Download...