如何将Meld设置为Git合并工具,仅显示冲突而不显示差异?

15

当我使用meld作为git mergetool解决合并冲突时,meld会显示本地/输出文件和远程/输出文件之间的差异(以蓝色或绿色表示),这是Git自动解决的,而不仅仅是实际的冲突(以红色突出显示)。当我点击向下箭头时,它会转到下一个(蓝色/绿色)差异,而不是下一个冲突(红色)。在主题中,有一张图片说明了这一点。

我该如何:

  • 忽略非冲突的差异
  • 或者像kdiff3一样直接跳到下一个冲突,而不会停留在差异处??

1
我非常喜欢使用meld与git mergetool,但我只想看到冲突。 - chrisdembia
4个回答

11

将以下内容添加到您的.gitconfig文件中:

[mergetool "meld"]
  cmd = meld --auto-merge "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

这是与Git默认情况下运行相同的命令,只是使用了--auto-merge选项,以便Meld可以自动解决尽可能多的冲突。


发现这个选项与 git difftool --tool=meld -d 不兼容。它会出现 Error: --output option requires 1 argument 的错误。 - ks1322

8
除了meld特定的参数外,您现在还有新的Git选项:
使用Git 2.31(2021年第一季度), "git mergetool"(man) 不修改冲突路径的三个版本(基础、本地和远程)。该命令学会了可选地准备这些文件,并解决未冲突部分

查看提交 9d9cf23, 提交 de8dafb, 提交 98ea309 (2021年2月9日) 由Seth House (whiteinge)完成。
(在提交78a26cb中由Junio C Hamano -- gitster --合并,2021年2月17日)

mergetool: 增加hideResolved配置

原始实现者:Felipe Contreras
签署者:Seth House

合并工具的目的是帮助用户解决Git无法自动解决的任何冲突。如果有必须手动解决的冲突,Git将写入一个名为MERGED的文件,其中包含了Git能够自行解决的所有内容以及用冲突标记包装的所有不能解决的内容。将MERGED视为两个或三个方面的差异的一种方式。如果将冲突标记的每个“侧”分别提取,则外部工具可以将这些冲突表示为并排的差异。然而,许多合并工具会对LOCAL和REMOTE进行diff,它们都包含合并之前的文件版本。由于Git自动解决的冲突不存在,因此它会强制用户手动重新解决这些冲突。一些合并工具也会显示MERGED,但通常只作为参考,而不是解决冲突的焦点。这增加了一个mergetool.hideResolved标志,它将使用冲突文件的每个相应“侧”覆盖LOCAL和REMOTE,并因此隐藏Git能够自行解决的所有冲突。覆盖这些文件将立即使任何使用它们的合并工具受益,而无需对工具进行任何更改。在流行合并工具的小型调查中没有注意到任何不良影响,因此这种行为默认为true。但是,可以通过将mergetool.hideResolved设置为false来全局禁用它。

请参阅 "Mergetools: Stop doing three-way merges!"。

git config现在包含在其手册页中:

mergetool.hideResolved

在合并期间,Git会自动解决尽可能多的冲突,并编写'MERGED'文件,在任何无法解决的冲突周围放置冲突标记;'LOCAL'和'REMOTE'通常表示来自Git冲突解决之前的文件版本。

此标志会导致'LOCAL'和'REMOTE'被覆盖,以便仅向合并工具呈现未解决的冲突。

可以通过mergetool.<tool>.hideResolved配置变量为每个工具进行配置。默认为true

在OP的情况下:
git config --global mergetool.meld.hideResolved true

这个描述在以下内容中:

mergetool:添加每个工具的支持和覆盖hideResolved标志

协助者:Johannes Sixt
协助者:Junio C Hamano
签署者:Seth House

Add a per-tool override flag so that users may enable the flag for one tool and disable it for another by setting mergetool.<tool>.hideResolved to false.

In addition, the author or maintainer of a mergetool may optionally override the default hideResolved value for that mergetool.
If the mergetools/<tool> shell script contains a hide_resolved_enabled function it will be called when the mergetool is invoked and the return value will be used as the default for the hideResolved flag.

hide_resolved_enabled () {
    return 1
}

Disabling may be desirable if the mergetool wants or needs access to the original, unmodified 'LOCAL' and 'REMOTE' versions of the conflicted file.

For example:

  • A tool may use a custom conflict resolution algorithm and prefer to ignore the results of Git's conflict resolution.
  • A tool may want to visually compare/constrast the version of the file from before the merge (saved to 'LOCAL', 'REMOTE', and 'BASE') with Git's conflict resolution results (saved to 'MERGED').

git config现在在其手册页面中包含以下内容:

mergetool.<tool>.hideResolved

允许用户为特定工具覆盖全局mergetool.hideResolved值。


7
在 Meld 中,您可以单击“Changes” > “Merge All”,这将合并大多数更改,但不包括冲突。

这对我似乎没有任何作用。meld 3.14.0 - Kos
如果你正在使用'xxdiff',则选项是"全局->合并"。谢谢! - ccbunney

0
如果你在Mac上使用cmd+D,它会跳转到下一个冲突,无论显示了多少更改。或者在菜单中选择查找 -> 下一个 -> 冲突。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接