在Mercurial中,如何找到修改特定文件的合并变更集?
log
和diff
的帮助指出了处理合并变更集的怪癖。
modifies()
还是将文件名作为另一个参数传递都是如此)有没有办法解决这些怪癖并找到变化?
这是一个示例任务:如果我正在处理与冲突的棘手合并,我可能想要找到自我的分支启动以来触及文件的默认的所有变更集,以便验证和理解合并。我想能够说
hg log -pr 'ancestor(mybranch,default)::default' path/to/myfile
让它向我展示我正在合并的所有相关变化(因为共同的祖先)。然而,由于这些怪癖,它错过了来自另一个分支的合并进入默认值的任何东西。
答案 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()"