我正在编写代码来分析我们对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中看到此文件已更改,该变量集不是合并的父级,但仍包含在从两个分支合并的更改中.