English ▾ 主題 ▾ 最新版本 ▾ git-mergetool 最後更新於 2.55.0

名稱

git-mergetool - 執行合併衝突解決工具以處理合併衝突

概要

git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…​]

描述

使用 git mergetool 來執行多種合併工具之一,以解決合併衝突。通常在執行 git merge 後使用。

如果提供了一個或多個 <file> 參數,將執行合併工具程式來解決每個檔案中的差異(會跳過沒有衝突的檔案)。指定目錄將包含該路徑中所有未解決的檔案。如果未指定 <file> 名稱,git mergetool 將對每個有合併衝突的檔案執行合併工具程式。

選項

-t <tool>
--tool=<tool>

使用 <tool> 指定的合併解決程式。有效值包括 emergegvimdiffkdiff3meldvimdifftortoisemerge。執行 git mergetool --tool-help 可取得有效 <tool> 設定的清單。

如果未指定合併解決程式,git mergetool 將使用設定變數 merge.tool。如果未設定設定變數 merge.toolgit mergetool 將選擇合適的預設值。

您可以透過設定設定變數 mergetool.<tool>.path 來明確提供工具的完整路徑。例如,您可以透過設定 mergetool.kdiff3.path 來設定 kdiff3 的絕對路徑。否則,git mergetool 假設該工具在 $PATH 中可用。

除了執行已知的合併工具程式外,git mergetool 還可以透過在設定變數 mergetool.<tool>.cmd 中指定呼叫指令列來執行替代程式,從而進行自訂。

當使用此工具呼叫 git mergetool 時(透過 -t--tool 選項,或 merge.tool 設定變數),將會呼叫已設定的指令列,並將 BASE 設為包含合併共同基礎的暫存檔案名稱(若有);LOCAL 設為包含目前分支上檔案內容的暫存檔案名稱;REMOTE 設為包含要合併檔案內容的暫存檔案名稱;而 MERGED 設為合併工具應寫入合併解決結果的檔案名稱。

如果自訂合併工具透過其退出代碼正確指示合併解決成功,則可將設定變數 mergetool.<tool>.trustExitCode 設為 true。否則,git mergetool 將在自訂工具退出後提示使用者指示解決是否成功。

--tool-help

列印可與 --tool 一起使用的合併工具清單。

-y
--no-prompt

在每次呼叫合併解決程式之前不進行提示。如果透過 --tool 選項或 merge.tool 設定變數明確指定了合併解決程式,則這是預設行為。

--prompt

在每次呼叫合併解決程式之前進行提示,讓使用者有機會跳過該路徑。

-g
--gui

當使用 -g--gui 選項呼叫 git-mergetool 時,預設合併工具將從設定的 merge.guitool 變數讀取,而不是 merge.tool。如果未設定 merge.guitool,我們將回退到在 merge.tool 下設定的工具。這可以使用設定變數 mergetool.guiDefault 自動選擇。

--no-gui

這會覆寫之前的 -g--gui 設定或 mergetool.guiDefault 設定,並從設定的 merge.tool 變數讀取預設合併工具。

-O<orderfile>

依照 <orderfile> 中指定的順序處理檔案,該檔案每行包含一個 shell glob 模式。這會覆寫 diff.orderFile 設定變數(參見 git-config[1])。若要取消 diff.orderFile,請使用 -O/dev/null

組態設定 (CONFIGURATION)

本節中此行以下的內容是從 git-config[1] 文件中選擇性包含的。內容與該處找到的內容相同

mergetool.<tool>.path

覆寫給定工具的路徑。這在您的工具不在 $PATH 中時非常有用。

mergetool.<tool>.cmd

指定呼叫該合併工具的指令。指定的指令會在 shell 中評估,並提供以下變數:BASE 是包含合併檔案共同基礎的暫存檔案名稱(若有);LOCAL 是包含目前分支上檔案內容的暫存檔案名稱;REMOTE 是包含從要合併的分支中取得的檔案內容的暫存檔案名稱;MERGED 包含合併工具應將成功合併結果寫入的檔案名稱。

mergetool.<tool>.hideResolved

允許使用者為特定工具覆寫全域的 mergetool.hideResolved 值。詳細說明請參閱 mergetool.hideResolved

mergetool.<tool>.trustExitCode

對於自訂合併指令,指定合併指令的退出代碼是否可用於判斷合併是否成功。若未設為 true,則會檢查合併目標檔案的時間戳記,如果檔案已更新,則假定合併成功;否則,將提示使用者指示合併是否成功。

mergetool.meld.hasOutput

舊版本的 meld 不支援 --output 選項。Git 會嘗試透過檢查 meld --help 的輸出,來偵測 meld 是否支援 --output。設定 mergetool.meld.hasOutput 將使 Git 跳過這些檢查並使用設定的值。將 mergetool.meld.hasOutput 設為 true 會告訴 Git 無條件使用 --output 選項,而 false 則避免使用 --output

mergetool.meld.useAutoMerge

當給定 --auto-merge 時,meld 會自動合併所有非衝突部分,突顯衝突部分,並等待使用者決定。將 mergetool.meld.useAutoMerge 設為 true 會告訴 Git 無條件對 meld 使用 --auto-merge 選項。將此值設為 auto 會使 git 偵測是否支援 --auto-merge,並僅在可用時使用 --auto-merge。值 false 則完全避免使用 --auto-merge,這也是預設值。

mergetool.<variant>.layout

設定 vimdiff 的 <variant>(可以是 vimdiffnvimdiffgvimdiff 之一)的分割視窗佈局。當使用 --tool=<variant> 啟動 git mergetool 時(或者若已將 merge.tool 設定為 <variant> 則無需使用 --tool),Git 將查詢 mergetool.<variant>.layout 以決定工具的佈局。如果無法取得變體特定設定,將回退使用 vimdiff 的設定。如果該設定也無法取得,則將使用 4 個視窗的預設佈局。若要設定佈局,請參閱 後端特定提示 章節。

mergetool.hideResolved

在合併期間,Git 會自動解決盡可能多的衝突,並寫入包含圍繞未解決衝突之衝突標記的 $MERGED 檔案;$LOCAL$REMOTE 通常是 Git 衝突解決前檔案的版本。此旗標會導致 $LOCAL$REMOTE 被覆寫,以便僅將未解決的衝突呈現給合併工具。可透過設定變數 mergetool.<tool>.hideResolved 為每個工具進行設定。預設為 false

mergetool.keepBackup

執行合併後,帶有衝突標記的原始檔案可以儲存為具有 .orig 副檔名的檔案。如果此變數設為 false,則不會保留此檔案。預設為 true(即保留備份檔案)。

mergetool.keepTemporaries

當呼叫自訂合併工具時,Git 會使用一組暫存檔案傳遞給該工具。如果工具傳回錯誤且此變數設為 true,則會保留這些暫存檔案;否則,它們將在工具退出後被刪除。預設為 false

mergetool.writeToTemp

Git 預設會在工作樹中寫入衝突檔案的暫存 BASELOCALREMOTE 版本。當設為 true 時,Git 將嘗試為這些檔案使用暫存目錄。預設為 false

mergetool.prompt

在每次呼叫合併解決程式之前進行提示。

mergetool.guiDefault

設為 true 以預設使用 merge.guitool(等同於指定 --gui 引數),或設為 auto 以根據 DISPLAY 環境變數的存在與否來選擇 merge.guitoolmerge.tool。預設值為 false,此時必須明確提供 --gui 引數才能使用 merge.guitool

暫存檔案

git mergetool 在解決合併時會建立 *.orig 備份檔案。一旦檔案已合併且其 git mergetool 工作階段已完成,即可安全地刪除這些檔案。

mergetool.keepBackup 設定變數設為 false 會導致 git mergetool 在檔案成功合併後自動刪除備份檔案。

後端特定提示

vimdiff

說明

當在 git mergetool 中指定 --tool=vimdiff 時,Git 會以 4 視窗佈局開啟 Vim,分佈如下

------------------------------------------
|             |           |              |
|   LOCAL     |   BASE    |   REMOTE     |
|             |           |              |
------------------------------------------
|                                        |
|                MERGED                  |
|                                        |
------------------------------------------

LOCALBASEREMOTE 是唯讀緩衝區,分別顯示特定提交中衝突檔案的內容(分別為「您正在合併入的提交」、「共同祖先提交」和「您正在合併自的提交」)

MERGED 是一個可寫入的緩衝區,您必須在其中解決衝突(使用其他唯讀緩衝區作為參考)。完成後,像往常一樣儲存並退出 Vim (:wq),或者如果您想中止,請使用 :cq 退出。

佈局設定

您可以透過設定設定變數 mergetool.vimdiff.layout 來更改 Vim 使用的視窗佈局,該變數接受一個字串,其中下列分隔符號具有特殊意義

  • + 用於「開啟新分頁」

  • , 用於「開啟新垂直分割」

  • / 用於「開啟新水平分割」

  • @ 用於指示在解決衝突後包含最終版本的檔案。如果不存在,預設將使用 MERGED

運算子的優先順序如下(您可以使用括號來更改它)

`@` > `+` > `/` > `,`

讓我們看看一些範例來了解它是如何運作的

  • layout = "(LOCAL,BASE,REMOTE)/MERGED"

    這與我們已經看到的預設佈局完全相同。

    請注意,/ 的優先順序高於 ,,因此這種情況下不需要括號。下一個佈局定義是等效的

    layout = "LOCAL,BASE,REMOTE / MERGED"
  • layout = "LOCAL,MERGED,REMOTE"

    如果出於某種原因,我們對 BASE 緩衝區不感興趣。

    ------------------------------------------
    |             |           |              |
    |             |           |              |
    |   LOCAL     |   MERGED  |   REMOTE     |
    |             |           |              |
    |             |           |              |
    ------------------------------------------
  • layout = "MERGED"

    僅顯示 MERGED 緩衝區。但請注意,所有其他緩衝區仍然載入在 vim 中,您可以使用「buffers」指令存取它們。

    ------------------------------------------
    |                                        |
    |                                        |
    |                 MERGED                 |
    |                                        |
    |                                        |
    ------------------------------------------
  • layout = "@LOCAL,REMOTE"

    當佈局中不存在 MERGED 時,您必須用小老鼠 (@)「標記」其中一個緩衝區。那將成為您在解決衝突後需要編輯並儲存的緩衝區。

    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     LOCAL         |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE"

    將開啟三個分頁:第一個是預設佈局的副本,而另外兩個僅分別顯示 (BASELOCAL) 與 (BASEREMOTE) 之間的差異。

    ------------------------------------------
    | <TAB #1> |  TAB #2  |  TAB #3  |       |
    ------------------------------------------
    |             |           |              |
    |   LOCAL     |   BASE    |   REMOTE     |
    |             |           |              |
    ------------------------------------------
    |                                        |
    |                MERGED                  |
    |                                        |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  | <TAB #2> |  TAB #3  |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    LOCAL           |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  |  TAB #2  | <TAB #3> |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE + (LOCAL/BASE/REMOTE),MERGED"

    與前一個範例相同,但增加了一個第四分頁,其中包含與第一個分頁相同的資訊,但佈局不同。

    ---------------------------------------------
    |  TAB #1  |  TAB #2  |  TAB #3  | <TAB #4> |
    ---------------------------------------------
    |       LOCAL         |                     |
    |---------------------|                     |
    |       BASE          |        MERGED       |
    |---------------------|                     |
    |       REMOTE        |                     |
    ---------------------------------------------

    請注意,在第三個分頁定義中,我們需要使用括號來使 , 的優先順序高於 /

變體

除了 --tool=vimdiff 之外,您也可以使用這些變體之一

  • --tool=gvimdiff,用於開啟 gVim 而不是 Vim。

  • --tool=nvimdiff,用於開啟 Neovim 而不是 Vim。

使用這些變體時,為了指定自訂佈局,您必須設定設定變數 mergetool.gvimdiff.layoutmergetool.nvimdiff.layout,而不是 mergetool.vimdiff.layout(儘管如果未設定變體特定設定,後者將用作回退)。

此外,為了與之前的 Git 版本向後相容,您也可以在 vimdiff 或任何變體後附加 123(例如:vimdiff3, nvimdiff1 等…)來使用預先定義的佈局。換句話說,使用 --tool=[g|n]vimdiff<x> 等同於使用 --tool=[g|n]vimdiff 並將設定變數 mergetool.[g|n]vimdiff.layout 設定為…

  • <x>=1: "@LOCAL, REMOTE"

  • <x>=2: "LOCAL, MERGED, REMOTE"

  • <x>=3: "MERGED"

範例:使用 --tool=gvimdiff2 將以三欄(LOCALMERGEDREMOTE)開啟 gvim

GIT

git[1] 套件的一部分