我正在编写代码来分析我们对Hg
的提交,并将我的结果与TortoiseHg
进行比较。在合并的情况下,我无法理解TortoiseHg
的行为。
当我在TortoiseHg
中选择合并变更集时,受影响的文件列表仅显示那些存在冲突的文件,除非我按下"Show All"
按钮。至少这似乎是基于我可以从网上收集的内容,以及观察到如果我按下全部显示按钮,列表中显示的文件有双箭头的意图。
我试图通过将变更集中的每个文件与父双方进行区分来模拟,并且如果它与父双方不同,则仅在我的分析中包含该文件。但是,我遇到TortoiseHg在合并描述中显示的文件,但只有一个父级不同。我在TortoiseHg
中也看到了 - 对父1或2的差异显示了变化,但另一个父变相没有。
我也尝试使用--git
选项进行区分,以确保它不是我缺少的元数据更改,但这根本不会改变结果。
获取有关我正在使用的变更集的信息:
hg log -v -r <rev> --removed --style xml
我选择合并变更集的父级,并且对于合并中的每个文件,执行
hg diff -r <parent1> -r <rev> filename
hg diff -r <parent2> -r <rev< filename
我发现文件TortoiseHg
在其报告的合并摘要中显示为已合并且没有冲突。
任何人都可以解释这种差异吗?
更新: 我能够使用TortoiseHg本身的源代码重现这一点。
从https://hg01.codeplex.com/tortoisehg克隆 在tortoiseHg中打开repo并选择rev 12602(58eb7c70)。这是与12599(6c716caa)和12601(39c95a81)的父母合并。
TortoiseHg将文件tortoisehg / hgqt / repowidget.py显示为合并中唯一冲突的文件,但
hg diff -r 12599 -r 12602 tortoisehg/hgqt/repowidget.py
不返回任何内容,而
hg diff -r 12601 -r 12602 tortoisehg/hgqt/repowidget.py
显示两行改变。
答案 0 :(得分:2)
我想我已经弄明白了什么是tortoisehg的逻辑(虽然我没有检查过来源确定)。
正如您所猜测的,乌龟在合并的两侧显示文件已更改为双箭头。但是,它并不仅仅看到合并与其每个父项的差异(例如p1(58eb7c70)::58eb7c70
和p2(58eb7c70)::58eb7c70
)。相反,乌龟发现合并中引入的所有变化,比较了两个父母的最后一个共同祖先。
我们以乌龟回购为例。 58eb7c70的祖先的图表视图是:
Jonathan:tortoisehg $ hg log --graph -r ::58eb7c70 -l 5 --template "{node|short}\n{desc|firstline}\n\n"
o 58eb7c70d501
|\ Merge with stable (noop)
| |
| o 39c95a813105
| | repowidget: show all errors on infobar
| |
| o da7ff15b4b96
| | repowidget: limit infobar error messages to 2 lines of up to 140 chars by default
| |
o | 6c716caa11fd
|\| Merge with stable
| |
| o 48c055ad634f
| | sync: show non-ascii command-line arguments correctly
| |
如您所见,合并58eb7c70d501合并了两个开发分支,一侧有一个变更集(p1,6c716caa11fd),另一侧有两个(p2,39c95a813105及其父级,da7ff15b4b96) )。这些分支发散的点是p1和p2的最后共同祖先 - 48c055ad634f。
(最后一个共同的祖先可以直接找到hg log -r "last(ancestor(p1(58eb7c70), p2(58eb7c70)))"
)
让我们看看在这两个分支上所做的更改。我们将合并的每个父级与共同的祖先进行比较:
Jonathan:tortoisehg $ hg status --rev "48c055ad634f::6c716caa11fd"
M .hgtags
M tortoisehg/hgqt/commit.py
M tortoisehg/hgqt/compress.py
M tortoisehg/hgqt/hgemail.py
M tortoisehg/hgqt/postreview.py
M tortoisehg/hgqt/purge.py
M tortoisehg/hgqt/rename.py
M tortoisehg/hgqt/repowidget.py
M tortoisehg/hgqt/revset.py
M tortoisehg/hgqt/run.py
M tortoisehg/hgqt/settings.py
M tortoisehg/hgqt/status.py
M tortoisehg/hgqt/sync.py
M tortoisehg/hgqt/visdiff.py
M tortoisehg/util/cachethg.py
M tortoisehg/util/hglib.py
Jonathan:tortoisehg $ hg status --rev "48c055ad634f::39c95a813105"
M tortoisehg/hgqt/repowidget.py
这些是58eb7c70d501实际合并的变化 - 两个分支上的一切都发生了变化,因为它们发生了分歧。如您所见,列表之间唯一的共同文件 - 在两个分支上唯一更改的文件 - 是tortoisehg/hgqt/repowidget.py
,正如您所期望的那样。您将看到此文件在da7ff15b4b96中已更改,该变量集不是合并的父级,但仍包含在从两个分支合并的更改中。
答案 1 :(得分:0)
tortoisehg/hgqt/repowidget.py
,这可以解释为什么您对hg diff
的第二次调用会给您带来结果;第一个调用比较了两个修订,其中没有注册到tortoisehg/hgqt/repowidget.py
;这听起来似乎对我来说,除非我错过了关于hg diff
行为的其他内容。