設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
-
2.52.0
2025-11-17
- 2.51.2 無變更
-
2.51.1
2025-10-15
- 2.50.1 → 2.51.0 無變更
-
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 之後執行。
如果給出了一個或多個 <file> 引數,則會執行合併工具程式來解決每個檔案中的差異(跳過沒有衝突的檔案)。指定一個目錄將包括該路徑下的所有未解決的檔案。如果未指定任何 <file> 名稱,git mergetool 將在所有有合併衝突的檔案上執行合併工具程式。
選項
-t<tool>--tool=<tool>-
使用 <tool> 指定的合併解析度程式。有效值包括
emerge、gvimdiff、kdiff3、meld、vimdiff和tortoisemerge。執行gitmergetool--tool-help獲取有效 <tool> 設定的列表。如果沒有指定合併解析度程式,
gitmergetool將使用配置變數merge.tool。如果未設定merge.tool配置變數,gitmergetool將選擇一個合適的預設值。您可以透過設定配置變數
mergetool.<tool>.path來顯式提供工具的完整路徑。例如,您可以透過設定mergetool.kdiff3.path來配置 kdiff3 的絕對路徑。否則,gitmergetool假定該工具在$PATH中可用。而不是執行一個已知的合併工具程式,
gitmergetool可以透過在配置變數mergetool.<tool>.cmd中指定要呼叫的命令列來定製以執行一個替代程式。當
gitmergetool使用此工具呼叫時(透過-t或--tool選項或merge.tool配置變數),配置的命令列將使用BASE設定為包含合併共同基礎的臨時檔案的名稱(如果可用);LOCAL設定為包含當前分支檔案內容的臨時檔案的名稱;REMOTE設定為包含要合併檔案的內容的臨時檔案的名稱;MERGED設定為合併工具應將合併解析度結果寫入的檔名稱。如果自定義合併工具透過其退出碼正確指示了合併解析度的成功,則配置變數
mergetool.<tool>.trustExitCode可以設定為true。否則,gitmergetool將提示使用者在自定義工具退出後指示解析度的成功。 --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> 可以是
vimdiff、nvimdiff、gvimdiff中的任何一個。當使用--tool=<variant> (或者如果merge.tool配置為 <variant> 且沒有--tool) 呼叫gitmergetool時,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 在工作樹中寫入衝突檔案的臨時
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<x> 等同於使用 --tool=[g|n]vimdiff 並將配置變數 mergetool.[g|n]vimdiff.layout 設定為…
-
<x>
=1:"@LOCAL,REMOTE" -
<x>
=2:"LOCAL,MERGED,REMOTE" -
<x>
=3:"MERGED"
例如:使用 --tool=gvimdiff2 將以三個列(LOCAL、MERGED 和 REMOTE)開啟 gvim。