我可以使用KDiff3处理冲突标记吗? (水银)

时间:2015-12-11 21:05:06

标签: merge mercurial diff kdiff3

KDiff3可以解释标准差异冲突标记吗?

说明:

我目前将KDiff3设置为Mercurial中的合并工具。我从终端会话中运行我的合并(例如hg merge),当遇到冲突时,Mercurial调用KDiff3进行3向合并,如预期的那样。

我想要做的是首先使用Mercurial的内部merge3算法并将冲突标记保留在文件中 - 然后随意解析单个文件(而不是尝试一次完成所有合并) 。

我想将合并工具传递给resolve命令(例如hg resolve --tool kdiff3 file.txt),但看起来KDiff3不处理冲突标记,而是希望将三个文件作为命令行参数提供。

有没有办法做我想要的?我宁愿在GUI中看到差异,也不愿手动编辑冲突标记。

1 个答案:

答案 0 :(得分:2)

我不完全确定你想要做什么;我猜,如果我错了,请纠正我。

首先,几乎所有合并工具都需要两个或三个文件来执行合并。这就是这些工具的设计方式;直接处理具有冲突标记的文件的工具非常少见。但是,这取决于您选择的工具;如果您需要,Mercurial和kdiff3无法帮助您:您需要一个不同的工具。

其次,让我们深入了解合并工具的配置方式。您可以查看hg help mergetools以获取可用合并工具的列表以及如何选择一个,以及hg help config.merge-tools(请注意破折号)以获取所需的配置参数。您可以通过执行以下操作查看kdiff3设置:

hg config merge-tools | grep -w kdiff3

默认情况下,不应设置merge-tools.kdiff3.premerge,因此hg merge将首先尝试使用其内部合并算法来解决冲突,并且只回退到kdiff3(假设您选择它作为合并工具)对于无冲突无法解析的文件。如何调用kdiff3:

hg config merge-tools.kdiff3.args

这里的默认值应该已经非常接近你想要的了。我现在假设您不希望kdiff3默认启动,但希望控制何时调用kdiff3。

如果你不希望在发生冲突的情况下默认转储到合并工具中你可以做什么 - 而且我不知道它与你想要的有多接近 - 首先要合并其中一个内部工具:merge:merge3:fail:merge:merge3会将冲突标记放在内部无法合并的文件中,并标记可以合并为已解析的文件,其余部分未解析。 :fail合并工具会将所有文件标记为未解决且双方都有变更,即使可以解决冲突(并且不会添加冲突标记)。这可以通过例如:

来完成
hg merge --tool :merge

此时,您将遇到Mercurial内部合并工具能够解决的一些冲突以及一些无法解决的冲突(请检查hg resolve -l以查看其状态,或hg resolve -l -T '{ifeq(status,"U","{path}\n","")}'仅列出尚未解决的文件)。

然后,您可以调用hg resolve --tool kdiff3 FILE(如果kdiff3是您的默认合并工具,也可以省略--tool kdiff3选项)来解决FILE中的任何冲突。 Mercurial将在调用合并工具之前生成本地,基础和其他修订;作为此过程的一部分,本地文件中的任何冲突标记都将被清除,因为该文件将替换为工作目录的第一个父文件的新副本。