設定與組態
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
- gitattributes
- 命令列介面規範
- Git 日常使用
- 常見問題 (FAQ)
- 詞彙表
- 掛鉤 (Hooks)
- gitignore
- gitmodules
- 修訂版本 (Revisions)
- 子模組
- 教學
- 工作流程
- 所有指南...
管理
底層命令 (Plumbing Commands)
-
2.55.0
2026-06-29
- 2.53.0 → 2.54.0 無變更
-
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-
當使用
-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>(可以是
vimdiff、nvimdiff、gvimdiff之一)的分割視窗佈局。當使用--tool=<variant> 啟動gitmergetool時(或者若已將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 預設會在工作樹中寫入衝突檔案的暫存
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 版本向後相容,您也可以在 vimdiff 或任何變體後附加 1、2 或 3(例如: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。
GIT
git[1] 套件的一部分