使用Git和KDiff3进行三方比较

15

有没有可能将Git配置为在KDiff3中使用三向比较?

我有两个分支,它们之间的差异太大了,无法自动合并。我必须检查每个合并点,而我认为最好的方法是检出我想要从另一个分支获取更改的分支,然后执行

git difftool HEAD_OF_OTHER_BRANCH -- .

然后在KDiff3中选择合并文件。浏览完文件后,我会立即提交。

我已经将merge.conflictstyle和diff.conflictstyle设置为diff3,但是KDiff3仍然以两种方式进行差异比较。这可能吗?我猜如果Git也将共同祖先的哈希作为参数发送,那么这是可能的,但它会吗?

有一个讨论关于如何在SVN和BC3中实现此操作,但我找不到任何关于Git和KDiff3的信息。


如果你正在尝试进行三方合并,为什么不使用mergetool(而不是difftool)? - CB Bailey
2
我不想让Git自动合并任何东西。我发现也许可以使用.gitattributes告诉Git不要自动合并。不过,合并将一次性合并整个庞大的系统,我宁愿根据目录逐个处理。是的,这很混乱,但我的意图是清理它。为此,我不得不做一些手工工作。 - Makis
2
我已经尝试过了,问题是树中也有很多二进制文件。而且还存在大量冲突的文件,我有点不敢一次性全部处理完毕。我宁愿分批进行。 - Makis
@mb14:你指的是哪种方法? - CB Bailey
@Charles:有一种方法可以禁用自动合并(使用你的二进制驱动程序?) - mb14
显示剩余5条评论
2个回答

10
在命令行上运行以下命令:
git config --global mergetool.kdiff3.path /path/for/your/kdiff3/binary  

然后,当解决冲突时,您只需执行以下操作:
git mergetool --tool=kdiff3

3
似乎git diff只执行两路差异比较(这对生成补丁等操作很有意义),除非在合并状态下,你必须进行合并。我前几天也遇到了类似的情况,最终我使用了“ours”策略进行合并。那种方法可行但不理想。也许我们需要一种“非解决”合并策略,它不会尝试解决任何冲突。你可以通过调整.git/MERGE_*文件并将所有文件设置为冲突状态来模拟它。
否则,显而易见的解决方案是检出3个不同的目录并运行kdiff3,但我想你可能正在寻找更加优雅的解决方案。

检查不同的目录应该没问题,但是如何创建包含共同祖先的第三个目录呢?只要我在单个仓库上工作,Git就会为我找出共同的祖先。 - Makis
1
@makis 你可以使用 'git merge-base' 命令来查找两个提交的共同祖先,非常方便。 - mb14
哦,所以所有文件的共同祖先都是相同的?我原以为这可能会因文件何时被编辑而有所不同。如果对于每个文件来说都是相同的,那么这肯定是一个可行的解决方案。 - Makis
git merge-base 将为您提供分叉的提交。实际上,该提交对于每个文件都是相同的,但只要您在分支之间没有挑选任何文件,那应该就足够了。 - mb14

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