设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
补丁
调试
邮件
外部系统
服务器管理
指南
管理
管道命令
- 2.45.1 → 2.47.0 无更改
- 2.45.0 04/29/24
- 2.43.1 → 2.44.2 无更改
- 2.43.0 11/20/23
- 2.41.1 → 2.42.3 无更改
- 2.41.0 06/01/23
- 2.38.3 → 2.40.3 无更改
- 2.38.2 12/11/22
- 2.38.1 无更改
- 2.38.0 10/02/22
- 2.37.1 → 2.37.7 无更改
- 2.37.0 06/27/22
- 2.31.1 → 2.36.6 无更改
- 2.31.0 03/15/21
- 2.22.1 → 2.30.9 无更改
- 2.22.0 06/07/19
- 2.20.1 → 2.21.4 无更改
- 2.20.0 12/09/18
- 2.12.5 → 2.19.6 无更改
- 2.11.4 09/22/17
- 2.2.3 → 2.10.5 无更改
- 2.1.4 12/17/14
- 2.0.5 12/17/14
描述
使用 git mergetool
运行多个合并工具中的一个来解决合并冲突。它通常在 git merge 之后运行。
如果给定一个或多个 <file> 参数,则合并工具程序将运行以解决每个文件中的差异(跳过那些没有冲突的文件)。指定目录将包括该路径中所有未解决的文件。如果没有指定 <file> 名称,git mergetool 将在每个有合并冲突的文件上运行合并工具程序。
选项
- -t <tool>
- --tool=<tool>
-
使用 <tool> 指定的合并冲突解决程序。有效值包括 emerge、gvimdiff、kdiff3、meld、vimdiff 和 tortoisemerge。运行
git mergetool --tool-help
获取有效 <tool> 设置列表。如果没有指定合并冲突解决程序,git mergetool 将使用配置变量
merge.tool
。如果未设置配置变量merge.tool
,git mergetool 将选择一个合适的默认值。可以通过设置配置变量
mergetool.<tool>.path
明确提供工具的完整路径。例如,可以通过设置mergetool.kdiff3.path
配置 kdiff3 的绝对路径。否则,git mergetool 假设工具在 PATH 中可用。除了运行已知的合并工具程序之外,git mergetool 可以通过在配置变量
mergetool.<tool>.cmd
中指定要调用的命令行来定制为运行其他程序。当 git mergetool 使用此工具调用时(通过
-t
或--tool
选项或merge.tool
配置变量),配置的命令行将使用$BASE
设置为包含要合并文件的公共基本内容的临时文件的名称(如果可用);$LOCAL
设置为包含当前分支上文件内容的临时文件的名称;$REMOTE
设置为包含要合并分支上文件内容的临时文件的名称,以及$MERGED
设置为合并工具应将合并解决结果写入的文件的名称。如果自定义合并工具使用其退出代码正确指示了合并解决的成功,则可以将配置变量
mergetool.<tool>.trustExitCode
设置为true
。否则,git mergetool 将在自定义工具退出后提示用户指示解决的成功。 - --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> 中指定的顺序处理文件,<orderfile> 每行包含一个 shell 通配符模式。这将覆盖
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 无条件地对meld
使用--auto-merge
选项。将此值设置为auto
使 git 检测--auto-merge
是否受支持,并且仅在可用时使用--auto-merge
。值为false
则完全避免使用--auto-merge
,这是默认值。 - mergetool.<vimdiff 变体>.layout
-
为 vimdiff 的
<变体>
配置分割窗口布局,<变体>
可以是vimdiff
、nvimdiff
或gvimdiff
之一。在使用--tool=<变体>
启动git mergetool
时(如果merge.tool
被配置为<变体>
,则不使用--tool
),Git 将查询mergetool.<variant>.layout
以确定工具的布局。如果未找到特定于变体的配置,则使用vimdiff
的配置作为备选。如果也未找到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 将打开 Vim 并使用 4 个窗口布局,分布如下
------------------------------------------ | | | | | 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 中,您可以使用“缓冲区”命令访问它们。------------------------------------------ | | | | | 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,]vimdiffx
与使用 --tool=[g,n,]vimdiff
并将 mergetool.[g,n,]vimdiff.layout
配置变量设置为…相同
-
x=1
:"@LOCAL, REMOTE"
-
x=2
:"LOCAL, MERGED, REMOTE"
-
x=3
:"MERGED"
示例:使用 --tool=gvimdiff2
将打开 gvim
并使用三列(LOCAL、MERGED 和 REMOTE)。
GIT
是 git[1] 套件的一部分