Mercurial 合并中显示的龟甲文件

Mercurial 合并中显示的龟甲文件,mercurial,merge,tortoisehg,Mercurial,Merge,Tortoisehg,我正在编写代码来分析我们对Hg的承诺,并将我的结果与Ortoisehg进行比较。在合并的情况下,我很难理解乌龟的行为 当我在TortoiseHg中选择一个合并变更集时,受影响的文件列表只显示那些有冲突的文件,除非我按下Show All按钮。根据我从网上收集到的信息,以及观察到如果我按下Show All按钮,列表中显示的文件会有一个双箭头,至少这似乎是我的意图 我试图通过将变更集中的每个文件与双亲区分开来,并仅在分析中包含与双亲不同的文件来模拟这种情况。然而,我遇到了Ortoisehg在合并描述中

我正在编写代码来分析我们对Hg的承诺,并将我的结果与Ortoisehg进行比较。在合并的情况下,我很难理解乌龟的行为

当我在TortoiseHg中选择一个合并变更集时,受影响的文件列表只显示那些有冲突的文件,除非我按下Show All按钮。根据我从网上收集到的信息,以及观察到如果我按下Show All按钮,列表中显示的文件会有一个双箭头,至少这似乎是我的意图

我试图通过将变更集中的每个文件与双亲区分开来,并仅在分析中包含与双亲不同的文件来模拟这种情况。然而,我遇到了Ortoisehg在合并描述中显示的文件,但这些文件只与一个父文件不同。我在龟类身上也看到了这一点——与双亲1或2的差异显示了变化,但另一个双亲没有

我还尝试了使用-git选项进行区分,以确保它不是我缺少的元数据更改,但这根本不会改变结果

要获取有关我正在使用的变更集的信息,请执行以下操作:

hg log -v -r <rev> --removed --style xml
不返回任何内容,而

hg diff -r 12601 -r 12602 tortoisehg/hgqt/repowidget.py

显示两行更改。

在中修改了tortoisehg/hgqt/repowidget.py,这可以解释为什么第二次调用hg diff会给出结果;第一个调用比较了两个修订版,在这两个修订版中,没有向tortoisehg/hgqt/repowidget.py注册任何更改;这对我来说似乎是合理的,除非我遗漏了关于hg diff行为的其他信息。

我想我已经弄明白了乌龟的逻辑是什么,尽管我还没有确定来源

正如您所猜测的,tortoise用双箭头显示合并两侧更改的文件。但是,它并不是简单地看合并到每个父级的差异,例如p158eb7c70::58eb7c70和p258eb7c70::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
| |
如您所见,merge 58eb7c70d501合并了两个开发分支,一个变更集p1 6c716caa11fd位于一侧,另一个变更集p2 39c95a813105及其父项da7ff15b4b96位于另一侧。这些分支分叉的点是p1和p2-48c055ad634f的最后一个共同祖先

最后一个共同的祖先可以通过hg log-r lastancestorp158eb7c70、p258eb7c70直接找到

让我们看看在这两个分支上所做的更改。我们将比较合并的每个父级与公共祖先:

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中更改,该更改集不是合并的父级,但仍包含在从两个分支合并的更改中。

您的存储库是公共的吗?有一些真实的数据可供查看会使这变得更容易。遗憾的是,没有,但我会看看我是否能在公共报告上重现这个问题。diff的行为对我来说是有意义的。我想弄明白的是,为什么乌龟会将这个文件标记为在合并的每一方都有更改,即冲突。我最感兴趣的是尝试复制乌龟的行为,这样我对我们的提交和合并所做的分析将给出与乌龟相同的答案。仅根据差异,我会说文件合并时没有冲突。这非常有意义。非常感谢您的深入分析。现在我知道了如何在自己的代码中重新创建这种逻辑。非常感谢。
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
| |
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