在 VS Code 中解決合併衝突

當 Git 無法自動合併來自不同分支的變更時,就會發生合併衝突。VS Code 提供了多種工具來協助您高效地識別並解決這些衝突。

了解如何使用內嵌編輯器動作、三向合併編輯器以及 AI 輔助解析,在 Visual Studio Code 中解決合併衝突。

理解合併衝突

當 Git 遇到無法自動解決的競爭性變更時,就會發生合併衝突。常見的情況包括:

  • 兩個分支修改了檔案中的同一行程式碼
  • 一個分支刪除了另一個分支正在修改的檔案
  • 兩個分支在相同位置新增了不同的內容

當您嘗試合併 (merge)、重置 (rebase)、提取 (pull) 或摘錄 (cherry-pick) 包含衝突變更的提交時,Git 會暫停該作業並標記衝突,以便您手動解決。

提示

進一步了解建立和管理分支,以組織您的開發工作並將合併衝突降至最低。

在 VS Code 中識別衝突

當發生合併衝突時,VS Code 會提供多種視覺指標來協助您識別並解決它們。具有衝突的檔案會出現在「原始程式碼控制」檢視的「合併變更」區段中。

編輯器衝突標記

當您開啟包含衝突的檔案時,VS Code 會使用下列標記突顯衝突的部分:

  • <<<<<<< HEAD(或目前分支名稱):標記您目前分支變更的開始
  • =======:分隔兩個衝突的版本
  • >>>>>>> branch-name:標記傳入分支變更的結束

Screenshot of inline conflict markers in the editor showing current and incoming changes.

CodeLens 動作

在每個衝突上方,VS Code 會顯示 CodeLens 動作,讓您快速解決衝突:

  • 採納目前變更 (Accept Current Change):僅保留您分支的版本
  • 採納傳入變更 (Accept Incoming Change):僅保留傳入分支的版本
  • 採納兩者 (Accept Both Changes):保留兩個版本,前後排列
  • 比較變更 (Compare Changes):開啟差異檢視,並排檢視差異

使用內嵌動作解決衝突

對於簡單的衝突,您可以直接在編輯器中使用 CodeLens 動作來解決:

  1. 從「原始程式碼控制」檢視開啟包含衝突的檔案

  2. 檢視以衝突標記標示的衝突區段

  3. 選擇衝突上方的其中一個 CodeLens 動作

    • 採納目前變更以保留您的版本
    • 採納傳入變更以保留傳入的版本
    • 採納兩者以保留兩個版本
  4. 針對檔案中的每個衝突重複上述步驟

  5. 解決所有衝突後儲存檔案

解決檔案中的衝突後,衝突標記會消失,您可以暫存該檔案,它會移至「原始程式碼控制」檢視中的「暫存變更」區段。接著即可繼續提交變更。

提示

對於需要組合兩者部分內容的更複雜衝突,您可以手動編輯檔案。刪除衝突標記(<<<<<<<=======>>>>>>>)並編輯內容以產生所需的結果。

使用三向合併編輯器

對於更複雜的衝突,或者當您想要並排檢視所有變更時,請使用三向合併編輯器。此編輯器提供包含三個面板的完整檢視:

  • 傳入 (Incoming)(左側):來自正在合併之分支的變更
  • 目前 (Current)(右側):來自您目前分支的變更
  • 結果 (Result)(下方):將被儲存的合併結果

開啟合併編輯器

若要開啟三向合併編輯器:

  1. 在「原始程式碼控制」檢視中選擇包含衝突的檔案

  2. 從內容選單中選擇在合併編輯器中開啟,或選擇編輯器頂端出現的在合併編輯器中解決按鈕

    Screenshot of the 3-way merge editor showing incoming, current, and result panels.

在合併編輯器中採納變更

合併編輯器會在每個衝突變更旁顯示帶有核取方塊的衝突。使用這些核取方塊來選擇要採納的變更:

  1. 檢視傳入目前面板中的變更

  2. 使用編輯器 CodeLens 動作來選擇要採納的變更

    • 採納傳入目前變更
    • 採納兩者的組合,智慧地合併兩項變更
    • 忽略變更,使其不包含在結果中
  3. 底部的結果面板會自動更新以顯示您的選擇

  4. 使用結果編輯器右側的衝突計數指標,以追蹤剩餘未解決的衝突數量。

  5. 當所有衝突解決後,選擇完成合併以暫存變更並關閉合併編輯器

在合併編輯器中進行手動編輯

有時您需要組合兩項變更的部分內容或建立全新的解決方案。您可以直接編輯結果面板:

  1. 結果面板中的任何位置點選以放置游標

  2. 視需要編輯內容,合併兩項變更的元素或撰寫新的程式碼

提示

使用傳入目前面板中的忽略按鈕來隱藏您不想採納的變更。這有助於專注於相關的衝突。

替代佈局

選擇合併編輯器右上角的三個點 (···) 可開啟包含額外選項的內容選單。您可以切換至垂直佈局並顯示基礎檢視,該檢視會顯示任何變更發生前的檔案狀態。

傳入目前結果旁邊的三個點為每個檢視提供了選項,例如顯示與基礎版本的並排差異、採納所有變更或重設結果。

使用 AI 解決衝突(實驗性功能)

注意

AI 輔助衝突解決是實驗性功能,需要 GitHub Copilot 訂閱。

VS Code 可以使用 AI 來協助自動解決合併衝突。此功能會分析衝突變更的兩個版本並提出解決方案:

  1. 在編輯器中開啟包含衝突的檔案

  2. 選擇編輯器頂端的使用 AI 解決合併衝突按鈕

    Screenshot of the AI merge conflict resolution button in the editor.

  3. VS Code 會開啟聊天檢視並啟動代理流程來分析衝突

  4. 檢視編輯器中提出的變更

  5. 採納解決方案或視需要進行手動調整

AI 會考量合併基礎(兩個分支的共同祖先)以及來自每個分支的變更,以產生試圖保留兩者意圖的解決方案。

完成合併作業

解決所有衝突後,您需要透過提交變更來完成合併作業:

  1. 確認所有衝突檔案皆已解決,並位於暫存變更區段中

  2. 輸入提交訊息並選擇提交以完成合併

提示

如果您需要放棄合併作業,請從指令選擇區選擇 Git: Abort Merge (Git:中止合併)。這會將您的儲存庫恢復至合併開始前的狀態。

將 VS Code 設定為預設合併工具

您可以透過在終端機中執行下列指令,將 VS Code 設定為您的預設 Git 合併工具。當您在命令列執行合併導致衝突時,Git 將會開啟 VS Code 的合併編輯器來協助您解決問題。

git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'

若要將 VS Code 設定為 Git 的預設差異工具,請執行:

git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

後續步驟

© . This site is unofficial and not affiliated with Microsoft.