设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
打补丁
调试
邮件
外部系统
服务器管理
指南
- gitattributes
- 命令行界面约定
- 日常 Git
- 常见问题解答 (FAQ)
- 术语表
- 钩子 (Hooks)
- gitignore
- gitmodules
- 版本
- 子模块
- 教程
- 工作流程
- 所有指南...
管理
底层命令 (Plumbing Commands)
- 2.45.1 → 2.49.0 没有变更
-
2.45.0
2024-04-29
- 2.43.1 → 2.44.3 没有变更
-
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。 运行
git mergetool --tool-help
获取有效 <tool> 设置的列表。如果未指定合并解决程序,则 git mergetool 将使用配置变量
merge.tool
。 如果未设置配置变量merge.tool
,则 git mergetool 将选择合适的默认值。可以通过设置配置变量
mergetool.<tool>.path
来显式提供工具的完整路径。 例如,可以通过设置mergetool.kdiff3.path
来配置 kdiff3 的绝对路径。 否则,git mergetool 假定该工具在 PATH 中可用。除了运行已知的合并工具程序之外,还可以通过在配置变量
mergetool.<tool>.cmd
中指定要调用的命令行来自定义 git mergetool 以运行替代程序。当使用此工具(通过
-t
或--tool
选项或merge.tool
配置变量)调用 git mergetool 时,将使用以下方式调用配置的命令行:$BASE
设置为包含合并的公共基础的临时文件的名称(如果可用);$LOCAL
设置为包含当前分支上文件内容的临时文件的名称;$REMOTE
设置为包含要合并的文件的内容的临时文件的名称;$MERGED
设置为合并工具应将合并解决方案的结果写入的文件名。如果自定义合并工具通过其退出代码正确指示合并解决方案的成功,则可以将配置变量
mergetool.<tool>.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<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.<vimdiff variant>.layout
-
配置 vimdiff 的
<variant>
的分割窗口布局,其中<variant>
可以是vimdiff
、nvimdiff
、gvimdiff
中的任何一个。在使用git mergetool
并指定--tool=<variant>
(或者如果merge.tool
配置为<variant>
,则不使用--tool
)启动时,Git 将参考mergetool.<variant>.layout
来确定工具的布局。如果特定于变体的配置不可用,则将使用vimdiff
的配置作为后备。如果这也不可用,将使用具有 4 个窗口的默认布局。要配置布局,请参阅BACKEND SPECIFIC HINTS
部分。 - 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 中,您可以使用“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,]vimdiffx
与使用 --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] 套件的一部分