簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-mergetool 上次更新於 2.52.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.tool 配置變數,git 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

git-mergetool 使用 -g--gui 選項呼叫時,將從配置的 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

配置

本節中以下所有內容均從 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 無條件地將 --auto-merge 選項與 meld 一起使用。將此值設定為 auto 會使 git 檢測 --auto-merge 是否受支援,並且僅在可用時才使用 --auto-merge。值為 false 則會完全避免使用 --auto-merge,這也是預設值。

mergetool.<variant>.layout

為 vimdiff 的 <variant> 配置分屏佈局,<variant> 可以是 vimdiffnvimdiffgvimdiff 中的任何一個。當使用 --tool=<variant> (或者如果 merge.tool 配置為 <variant> 且沒有 --tool) 呼叫 git mergetool 時,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 版本,你還可以將 123 追加到 vimdiff 或任何變體(例如 vimdiff3nvimdiff1 等)以使用預定義的佈局。換句話說,使用 --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] 套件的一部分