English ▾ 主题 ▾ 最新版本 ▾ git-mergetool 最后更新于 2.45.0

名称

git-mergetool - 运行合并冲突解决工具来解决合并冲突

概要

git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…​]

描述

使用 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> 可以是 vimdiffnvimdiffgvimdiff 中的任何一个。在使用 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.guitoolmerge.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                  |
|                                        |
------------------------------------------

LOCALBASEREMOTE 是只读缓冲区,显示特定提交中冲突文件的内容(分别为“您正在合并到的提交”、“共同祖先提交”和“您正在合并自的提交”)

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"

    将打开三个选项卡:第一个是默认布局的副本,而其他两个仅显示(BASELOCAL)以及(BASEREMOTE)之间的差异。

    ------------------------------------------
    | <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.layoutmergetool.nvimdiff.layout,而不是 mergetool.vimdiff.layout(尽管后者将用作备用方案,如果未设置特定于变体的配置)。

此外,为了向后兼容以前的 Git 版本,您还可以将 123 附加到 vimdiff 或任何变体(例如:vimdiff3nvimdiff1 等…​)以使用预定义的布局。换句话说,使用 --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] 套件的一部分

scroll-to-top