mercurial – 合并中显示的TortoiseHg文件

我正在编写代码来分析我们对Hg的提交,并将我的结果与TortoiseHg进行比较.在合并的情况下,我无法理解TortoiseHg的行为.

当我在TortoiseHg中选择合并变更集时,受影响文件列表仅显示那些存在冲突的文件,除非我按下“全部显示”按钮.至少这似乎是基于我可以从网上收集的内容,以及观察到如果我按下全部显示按钮,列表中显示的文件有双箭头的意图.

我试图通过将变更集中的每个文件与父双方进行区分来模拟,并且如果它与父双方不同,则仅在我的分析中包含该文件.但是,我遇到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

显示两条线在变化.

最佳答案 我想我已经弄明白了什么是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(祖先(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中看到此文件已更改,该变量集不是合并的父级,但仍包含在从两个分支合并的更改中.

点赞