查找修改文件的mercurial合并

时间:2014-08-13 20:21:49

标签: merge mercurial

在Mercurial中,如何找到修改特定文件的合并变更集?

logdiff的帮助指出了处理合并变更集的怪癖。

  • 他们只显示与第一个父母的差异,而不是第二个,
  • 并且他们不会将变更集视为修改给定文件,除非相对于合并的两个父项存在差异。 (无论是在revset中使用modifies()还是将文件名作为另一个参数传递都是如此)

有没有办法解决这些怪癖并找到变化?

这是一个示例任务:如果我正在处理与冲突的棘手合并,我可能想要找到自我的分支启动以来触及文件的默认的所有变更集,以便验证和理解合并。我想能够说

hg log -pr 'ancestor(mybranch,default)::default' path/to/myfile

让它向我展示我正在合并的所有相关变化(因为共同的祖先)。然而,由于这些怪癖,它错过了来自另一个分支的合并进入默认值的任何东西。

2 个答案:

答案 0 :(得分:1)

好像你正在试图弄清楚变更集如何将其变成一个分支(或者变更集将进入一个分支)。一个常见问题,因为Mercurial中的合并与非分布式版本控制系统中的合并不同。在传统的VCS中,如Subversion,合并会创建一个新版本,其中包含来自该传入分支的所有更改。因此,很容易找到文件发生变化的合并,因为它在合并中发生了变化。

然而,对于Mercurial,合并不会表现得这样:合并更像是标签操作。 Mercurial将传入分支上的所有更改标记为现在属于新分支。

因此,当试图找出文件的更改如何进入您的分支时,您必须提出两个问题:什么变更集引入了您感兴趣的变更以及哪些合并将其带入您的分支。您可以使用file() revset查询来回答第一个问题。拥有该变更集后,您可以使用this revset query找出合并后的内容:'descendants(<the_rev>) and branch(<the branch>)

要查找将在修改特定文件的中合并的所有更改集:

 hg log -r "(::<incoming_branch> - ::<destination_branch>) and file('path/to/the/file')"
  • ::<incoming_branch>获取传入分支的所有祖先
  • ::<destination_branch>获取目标分支的所有祖先
  • -删除所有常见的更改集,只留下那些尚未合并的
  • file('path/to/the/file')会将结果过滤为修改该文件的更改集

答案 1 :(得分:0)

  

默认情况下触及文件的所有变更集

对不起,但不仅仅是

hg log -r "branch(default) & file('path/to/myfile')"

或者,如果你想让-M也

hg log -r "branch(default) & file('path/to/myfile') & !merge()"