簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-mergetool 最後更新於 2.50.0

名稱

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

概要

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

描述

使用 git mergetool 執行多個合併工具中的一個來解決合併衝突。它通常在 git merge 之後執行。

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

選項

-t <工具>
--tool=<工具>

使用 <工具> 指定的合併解決程式。有效值包括 emergegvimdiffkdiff3meldvimdifftortoisemerge。執行 git mergetool --tool-help 檢視有效的 <工具> 設定列表。

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

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

除了執行已知的合併工具程式之一,git mergetool 可以透過在配置變數 mergetool.<工具>.cmd 中指定要呼叫的命令列來定製執行替代程式。

當使用此工具呼叫 git mergetool 時(透過 -t--tool 選項,或透過 merge.tool 配置變數),配置的命令列將被呼叫,其中:如果可用,BASE 將設定為包含合併的共同基礎的臨時檔名稱;LOCAL 將設定為包含當前分支上檔案內容的臨時檔名稱;REMOTE 將設定為包含要合併的檔案內容的臨時檔名稱;MERGED 將設定為合併工具應寫入合併解決結果的檔名稱。

如果自定義合併工具透過其退出程式碼正確指示了合併解決的成功,則可以將配置變數 mergetool.<工具>.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<順序檔案>

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

配置

本節中以下所有內容均從 git-config[1] 文件中選擇性地包含。內容與彼處相同:

mergetool.<工具>.path

覆蓋給定工具的路徑。當您的工具不在 $PATH 中時,這很有用。

mergetool.<工具>.cmd

指定呼叫指定合併工具的命令。指定命令在 shell 中評估,並提供以下變數:BASE 是一個臨時檔案的名稱,如果可用,它包含要合併檔案的公共基礎;LOCAL 是一個臨時檔案的名稱,它包含當前分支上檔案的內容;REMOTE 是一個臨時檔案的名稱,它包含來自正在合併的分支的檔案內容;MERGED 包含合併工具應寫入成功合併結果的檔名稱。

mergetool.<工具>.hideResolved

允許使用者為特定工具覆蓋全域性 mergetool.hideResolved 值。有關完整說明,請參見 mergetool.hideResolved

mergetool.<工具>.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.<變體>.layout

配置 vimdiff 的 <變體> 的分屏佈局,該變體可以是 vimdiffnvimdiffgvimdiff 中的任何一個。當使用 --tool=<變體> 啟動 git mergetool 時(如果 merge.tool 配置為 <變體>,則不帶 --tool),Git 將查閱 mergetool.<變體>.layout 以確定工具的佈局。如果特定變體的配置不可用,則使用 vimdiff 的配置作為回退。如果仍不可用,將使用包含 4 個視窗的預設佈局。要配置佈局,請參閱 後端特定提示 部分。

mergetool.hideResolved

在合併過程中,Git 將自動解決儘可能多的衝突,並寫入包含衝突標記的 $MERGED 檔案,這些標記圍繞著它無法解決的任何衝突;$LOCAL$REMOTE 通常是 Git 解決衝突之前的版本。此標誌會導致 $LOCAL$REMOTE 被覆蓋,以便只將未解決的衝突呈現給合併工具。可以透過 mergetool.<工具>.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 等同於使用 --tool=[g|n]vimdiff 並將配置變數 mergetool.[g|n]vimdiff.layout 設定為…​

  • =1: "@LOCAL, REMOTE"

  • =2: "LOCAL, MERGED, REMOTE"

  • =3: "MERGED"

示例:使用 --tool=gvimdiff2 將開啟具有三列(LOCALMERGEDREMOTE)的 gvim

GIT

Git[1] 套件的一部分

scroll-to-top