设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 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
。