設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.50.1 無更改
-
2.50.0
2025-06-16
- 2.45.1 → 2.49.1 無更改
-
2.45.0
2024-04-29
- 2.43.1 → 2.44.4 無更改
-
2.43.0
2023-11-20
- 2.41.1 → 2.42.4 無更改
-
2.41.0
2023-06-01
- 2.38.3 → 2.40.4 無變化
-
2.38.2
2022-12-11
- 2.38.1 無更改
-
2.38.0
2022-10-02
- 2.37.1 → 2.37.7 無更改
-
2.37.0
2022-06-27
- 2.31.1 → 2.36.6 無變化
-
2.31.0
2021-03-15
- 2.22.1 → 2.30.9 無變化
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 無更改
-
2.20.0
2018-12-09
- 2.12.5 → 2.19.6 無變化
-
2.11.4
2017-09-22
- 2.2.3 → 2.10.5 無變化
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
描述
使用 git
mergetool
執行多個合併工具中的一個來解決合併衝突。它通常在 git
merge
之後執行。
如果給定一個或多個 <檔案> 引數,將執行合併工具程式以解決每個檔案中的差異(跳過沒有衝突的檔案)。指定一個目錄將包含該路徑中所有未解決的檔案。如果未指定 <檔案> 名稱,git
mergetool
將對所有存在合併衝突的檔案執行合併工具程式。
選項
-t
<工具>--tool=
<工具>-
使用 <工具> 指定的合併解決程式。有效值包括
emerge
、gvimdiff
、kdiff3
、meld
、vimdiff
和tortoisemerge
。執行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 的 <變體> 的分屏佈局,該變體可以是
vimdiff
、nvimdiff
、gvimdiff
中的任何一個。當使用--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 預設將衝突檔案的臨時
BASE
、LOCAL
和REMOTE
版本寫入工作樹。當設定為true
時,Git 將嘗試為這些檔案使用一個臨時目錄。預設為false
。 mergetool.prompt
-
在每次呼叫合併解決程式之前進行提示。
mergetool.guiDefault
-
設定為
true
以預設使用merge.guitool
(相當於指定--gui
引數),或設定為auto
以根據DISPLAY
環境變數值的存在情況選擇merge.guitool
或merge.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 | | | ------------------------------------------
LOCAL
、BASE
和 REMOTE
是隻讀緩衝區,分別顯示衝突檔案在特定提交(“您合併到的提交”、“共同祖先提交”和“您合併自的提交”)中的內容。
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"
將開啟三個標籤頁:第一個是預設佈局的副本,而另外兩個分別只顯示 (
BASE
和LOCAL
) 以及 (BASE
和REMOTE
) 之間的差異。------------------------------------------ | <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.layout
和 mergetool.nvimdiff.layout
,而不是 mergetool.vimdiff.layout
(如果未設定特定於變體的變數,則後者將用作回退)。
此外,為了向後相容以前的 Git 版本,您還可以將 1
、2
或 3
附加到 vimdiff
或任何變體(例如:vimdiff3
、nvimdiff1
等)以使用預定義佈局。換句話說,使用 --tool=
[g
|n
]vimdiff
--tool=
[g
|n
]vimdiff
並將配置變數 mergetool.
[g
|n
]vimdiff.layout
設定為…
-
=1
:"@LOCAL,
REMOTE"
-
=2
:"LOCAL,
MERGED,
REMOTE"
-
=3
:"MERGED"
示例:使用 --tool=gvimdiff2
將開啟具有三列(LOCAL
、MERGED
和 REMOTE
)的 gvim
。