iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
Modern Web

Git 起來!每日一招學起來系列 第 23

Day 23:merge 進階 + conflict 解法 —— 分支匯流高手指南

  • 分享至 

  • xImage
  •  

前面 Day 10 我們學過 merge 的基本用法,今天進入進階篇,學會如何像高手一樣合併分支,並且不再怕衝突(紅紅綠綠) 😎。

想像一下:多個分支就像多條河流,要把它們匯入主河道,既要保持水流暢通,也要避免淹沒河岸。這就是 merge 高手的挑戰。


為什麼要進階學 merge?

基本的 git merge branch 只能處理簡單情況,但在團隊協作中:

  • 多人同時修改同一區塊
  • 需要保留歷史痕跡
  • 想整理提交歷史

這時就要用到進階策略。


merge 的進階技巧

指定 merge 策略

  • recursive(預設):大部分情況自動合併
  • ours / theirs:保留某一分支內容
git merge -s ours feature   # 保留本分支
git merge -s theirs feature # 保留合併分支

fast-forward 與 no-ff

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,保留分支痕跡。


squash 合併

git merge --squash feature
git commit -m "整合 feature 分支"
  • 將多個 commit 壓縮成單一 commit
  • 適合整理歷史,避免太多小 commit

歷史示意:

A --- B --- C   (main)
          \
           D --- E --- F   (feature)

squash 後:

A --- B --- C --- S   (main)

S 是整合 feature 的單一 commit,歷史乾淨。


merge conflict 解法

當兩個分支修改同一區塊,Git 無法自動決定,就會發生衝突。

a. 發生衝突

git merge feature
# Git 提示:CONFLICT

b. 衝突標記

<<<<<<< HEAD
本分支修改
=======
合併分支修改
>>>>>>> feature
  • HEAD:目前分支內容
  • =======:分隔線
  • >>>>>>> feature:合併分支內容

c. 解決衝突流程

  1. 編輯檔案,保留正確內容
  2. git add <file> 標記已解決
  3. git commit 完成 merge

d. 衝突提示指令

git status           # 查看衝突檔案
git diff             # 查看差異
git merge --abort    # 放棄合併
git merge --continue # 繼續完成合併

解決衝突後,歷史示意:

A --- B --- C --- M   (main)
          \           /
           D --- E   (feature)

M 是 merge commit,整合了兩邊修改。


小技巧

  • 事先同步:合併前 git pull 確保最新
  • 分支策略:避免長時間單獨修改同區塊
  • 測試再合併:尤其是 squash 或 no-ff 合併
  • 視覺化工具:VSCode、Sourcetree、Meld 等可快速解衝突

小挑戰 💪

  1. 創建兩個分支 feature1feature2,同時修改同一個檔案
  2. 嘗試合併 feature1 → main,解決衝突
  3. 使用 -no-ff 合併,觀察 commit 歷史
  4. 使用 -squash 合併另一個 feature,觀察歷史差異

小結

  • merge 進階策略:fast-forward、no-ff、squash
  • merge conflict 是多人開發必經過程,掌握流程從容解決
  • 熟練這篇,就能像高手一樣管理分支歷史,團隊協作不慌

想像分支是河流,merge 是把河流匯入大河道。衝突就像水流碰撞,解決它,水流才能順暢


上一篇
Day 22:git status & git log 進階 —— 專案考古學家的放大鏡
系列文
Git 起來!每日一招學起來23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言