34

如何强制始终显示合并工具 GUI 并禁用任何自动解析?

有时,当合并期间发生冲突并且我使用合并工具时,它会在我点击Enter问题“点击返回以启动合并解决工具 (kdiff3)”后立即返回,并且没有显示任何 GUI,并且似乎解决了冲突。

我现在将 Git 配置为使用KDiff3作为合并工具,但是当我codecompare指定了合并工具时,它也发生了。我知道 KDiff3 中有一个选项“自动保存并在没有冲突的情况下退出合并”,理论上这可能会导致所描述的行为,但我一直禁用/取消选中此选项。

另外,在 Git mergetool gitconfig 中直接有trustExitCode选项,我已将其设置为 true,但即使将其设置为 false,GUI 也不会显示。

我不确定谁会自动解析。Mergetool 在某些预处理或 KDiff3 中?

我在 Windows 上运行并安装了 Git 扩展。

特定于 KDiff3 的类似问题也在这里被问到:Kdiff3 won't open with mergetool command

4

6 回答 6

36

Git 已--auto硬编码为 KDiff3 的命令行选项,如果所有冲突都可由 KDiff3 自动解决,则会导致 GUI 不显示。在 KDiff3 设置中,您可以指定要忽略的命令行选项,但放在--auto那里对我不起作用。

作为一种解决方法,我将自己的 KDiff3 变体配置为合并工具:

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\""

这与 Git 默认为 KDiff3 使用的非常相似,但没有--auto标志。

现在您可以全局调用git mergetool -t kdiff3NoAuto或配置kdiff3NoAuto为 mergetool,并且 KDiff3 将在解决冲突时始终显示。

关于你问题的第二部分,如果你真的想禁用任何自动解析,只需添加--qallkdiff3上面的命令行。但是您必须手动解决文件中的所有更改,即使是那些不会导致 Git 冲突的更改。最好的情况是:KDiff3 展示了 Git 如何合并文件并将冲突留给用户选择。

于 2013-04-04T13:44:19.277 回答
3

Bob esponja 对已接受答案的评论对我使用 KDiff3 0.9.98 非常有效。

添加--auto要忽略的命令行选项:

Settings | Configure KDiff3... | Integration tab.

KDiff3 出现 Conflicts 对话框,指示Nr of unsolved conflict: 0,但是您可以根据需要检查/修改合并状态。

比配置您自己的变体更方便一点,因为无论是从 git mergetool、Source Tree 还是任何使用 mergetool 的工具,它都可以按预期工作。

于 2020-04-24T18:44:24.060 回答
2

的行为git mergetool完全取决于选择的合并工具和 Git 传递给它的命令行。因此,要改变它的行为,你需要找到一个命令行,并配置 Git 以使用该命令行。

我自己也有这个问题(特别是关于 KDiff3),PiQuer 的回答让我有所了解,但它让我开始思考。应该有一种方法可以准确地为 KDiff3 复制 Git 的默认行为,除非没有该--auto选项(这就是导致 KDiff3 不显示 GUI 的原因)。

看起来 KDiff3 合并工具的默认命令的来源位于文件git/mergetools/kdiff3中。这看起来像一个 shell 脚本,所以我们应该能够准确地复制它!把它放在一行上,删除--auto和转义东西给了我们这个:

git config --global mergetool.kdiff3.cmd "if \"\$base_present\"; then \"\$merge_tool_path\" --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; else \"\$merge_tool_path\" --L1 \"\$MERGED (Local)\" --L2 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; fi"

和变量在 Git 文档base_presentmerge_tool_path没有特别提到可以在 中使用mergetool.<tool>.cmd,因此在将来的某个时候,此命令可能无法按原样工作。但是,它们可以很容易地替换为一个命令来测试是否BASE引用了一个存在的文件,以及一个 KDiff3 的硬编码路径。

请注意,上面的命令替换了 Gitkdiff3合并工具的默认命令,而不是创建一个单独的命令。

关于原始问题中的其他几点:

  • trustExitCode设置告诉 Git 合并工具的退出代码是否是合并是否成功的正确指示。它不会影响合并工具的行为,而是会影响合并工具退出后 Git 的行为。请参阅git-mergetool 的手册
  • 您在输入后看到的自动分辨率都是git mergetool由合并工具本身完成的。git mergetool仅在需要合并的文件版本上调用外部工具。
于 2017-02-28T22:59:33.550 回答
1

我发现的最简单的方法是:

git config --global mergetool.kdiff3.cmd 'if $base_present; then "$merge_tool_path" --L1 "$MERGED (Base)" --L2 "$MERGED (Local)" --L3 "$MERGED (Remote)" -o "$MERGED" "$BASE" "$LOCAL" "$REMOTE" >/dev/null 2>&1; else "$merge_tool_path" --L1 "$MERGED (Local)" --L2 "$MERGED (Remote)" -o "$MERGED" "$LOCAL" "$REMOTE" >/dev/null 2>&1; fi'
git config --global difftool.kdiff3.cmd '"$merge_tool_path" --L1 "$MERGED (A)" --L2 "$MERGED (B)" "$LOCAL" "$REMOTE" >/dev/null 2>&1'

作为参考,直接在GitHub 上的源代码中查看长期存在的默认值,我仅通过删除--auto.

如果遇到任何问题,请使用以下命令恢复默认设置:

git config --global --unset mergetool.kdiff3.cmd
git config --global --unset difftool.kdiff3.cmd
于 2021-12-14T06:29:00.693 回答
0

无需配置仅在发生冲突时才调用的 mergetool,只需使用 KDiff3 设置合并驱动程序:

git config merge.kdiff.driver 'kdiff3  "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor"  -L2 "Working Copy" --L3 "Version from Other Branch"'

您可以通过添加使该驱动程序全局化--global。但是您需要在存储库中添加一个 .gitattribute :

*  merge=kdiff
于 2016-05-20T16:01:18.610 回答
0

如果问题与不需要的冲突自动解决严格相关......

KDiff3 打开后,您只需Merge / Set Deltas to Conflicts从菜单中按 a,状态就会更新为漂亮的、人为驱动的冲突解决问题。

于 2019-03-20T09:17:29.603 回答