问题 与Git和KDiff3进行三向比较


是否可以设置Git以便我可以在KDiff3中使用三向比较?

我有两个分支,它们太不同了,无法自动合并它们,我只需检查每个合并点,我认为最好的方法是检查分支我希望从另一个分支的更改并说

git difftool HEAD_OF_OTHER_BRANCH -- .

然后在KDiff3中选择合并文件。在完成了我刚刚提交的文件之后。

我已将merge.conflictstyle和diff.conflictstyle设置为diff3,但KDiff3仍然以双向diff开头。这可能吗?我想如果Git也发送共同的祖先的哈希作为参数,这是可能的,但它呢?

讨论 关于如何使用SVN和BC3进行此操作,但我找不到Git和KDiff3的任何内容。


7234
2017-09-03 12:39


起源

如果您尝试进行三向合并,为什么不使用mergetool(而不是difftool)? - CB Bailey
我不希望Git自动提供任何东西。我确实发现可能我可以使用.gitattributes来告诉Git不要自动注册。仍然,合并将一次性合并整个大型系统,我宁愿在目录基础上处理这个问题。是的,这是一团糟,但我打算清理它。为此,我不幸要做一些手工。 - Makis
@Makis:做一个合适的合并似乎是明智的,但使用一个不自动化的策略或通过强制'二进制'合并驱动程序 .gitattributes 总是留下冲突让用户解决。至少这种方式你可以使用mergetool以逻辑方式启动kdiff3。 - CB Bailey
我已经尝试过,问题是树上还有相当多的二进制文件。并且有大量冲突的文件,我有点犹豫要一次性完成所有这些文件。我宁愿小批量工作。 - Makis
为什么二进制文件有问题?实际上,您只是试图将所有文件视为二进制文件。真正合并的问题在于,您需要(在某些时候)进行合并提交,因此尝试分阶段执行并获得真实历史是相互冲突的目标。 - CB Bailey


答案:


似乎git diff只做一个双向差异(生成补丁等有意义),除非在合并状态下,你必须为此进行合并。前几天我处于类似的情况,我最终使用了 ours 战略。虽然有效,但并不理想。也许我们需要一种“非分辨”合并策略,它不会试图解决任何冲突。您可以通过调整.git / MERGE_ *文件并将所有文件设置为冲突来模拟它。
否则显而易见的解决方案是签出3个不同的目录并运行kdiff3,但我想你正在寻找更优雅的解决方案


2
2017-09-03 13:40



检查不同的目录是可以的,除了如何创建保存共同祖先的第三个目录?只要我在一个回购单上工作,Git就会为我找出共同的祖先。 - Makis
@makis你可以使用'git merge-base'命令找到两个提交的共同祖先,方便。 - mb14
嗯,所有共同的祖先对于所有文件都是一样的吗?我认为这可能会有所不同,具体取决于编辑文件的时间。如果每个文件都相同,那么这肯定是一个可行的解决方案。 - Makis
git merge-base将为您提供fork的提交。这个提交确实对每个文件都是一样的,但是只要你没有在分支之间挑选任何文件,这应该是一个足够好的近似。 - mb14


在命令行上运行:

git config --global mergetool.kdiff3.path /path/for/your/kdiff3/binary  

然后,在解决冲突时,您只需要做:

git mergetool --tool=kdiff3

9
2018-03-05 18:20



正是我在寻找的! - memnoch_proxy