前面 Day 10 我們學過 merge 的基本用法,今天進入進階篇,學會如何像高手一樣合併分支,並且不再怕衝突(紅紅綠綠) 😎。
想像一下:多個分支就像多條河流,要把它們匯入主河道,既要保持水流暢通,也要避免淹沒河岸。這就是 merge 高手的挑戰。
基本的 git merge branch
只能處理簡單情況,但在團隊協作中:
這時就要用到進階策略。
recursive
(預設):大部分情況自動合併ours / theirs
:保留某一分支內容git merge -s ours feature # 保留本分支
git merge -s theirs feature # 保留合併分支
git merge --ff-only feature # 只允許快進合併
git merge --no-ff feature # 強制產生 merge commit
-ff-only
:保持歷史線性-no-ff
:保留合併痕跡,便於追蹤分支歷史歷史示意:
A --- B --- C (main)
\
D --- E (feature)
快進合併範例
執行 git merge feature
(快進合併)結果:
A --- B --- C --- D --- E (main)
no-ff 合併範例
執行 git merge --no-ff feature
結果:
A --- B --- C -------- M (main)
\ /
D --- E (feature)
M 是 merge commit,保留分支痕跡。
git merge --squash feature
git commit -m "整合 feature 分支"
歷史示意:
A --- B --- C (main)
\
D --- E --- F (feature)
squash 後:
A --- B --- C --- S (main)
S 是整合 feature 的單一 commit,歷史乾淨。
當兩個分支修改同一區塊,Git 無法自動決定,就會發生衝突。
git merge feature
# Git 提示:CONFLICT
<<<<<<< HEAD
本分支修改
=======
合併分支修改
>>>>>>> feature
HEAD
:目前分支內容=======
:分隔線>>>>>>> feature
:合併分支內容git add <file>
標記已解決git commit
完成 mergegit status # 查看衝突檔案
git diff # 查看差異
git merge --abort # 放棄合併
git merge --continue # 繼續完成合併
解決衝突後,歷史示意:
A --- B --- C --- M (main)
\ /
D --- E (feature)
M 是 merge commit,整合了兩邊修改。
git pull
確保最新feature1
、feature2
,同時修改同一個檔案feature1 → main
,解決衝突-no-ff
合併,觀察 commit 歷史-squash
合併另一個 feature,觀察歷史差異想像分支是河流,merge 是把河流匯入大河道。衝突就像水流碰撞,解決它,水流才能順暢