Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control Mercurial关于文件冲突的内部机制_Version Control_Mercurial_Distributed_Internals - Fatal编程技术网

Version control Mercurial关于文件冲突的内部机制

Version control Mercurial关于文件冲突的内部机制,version-control,mercurial,distributed,internals,Version Control,Mercurial,Distributed,Internals,我正在研究Mercurial,但我不明白它是如何检测文件冲突的 当一个集中式SCM(作为SubVersion)检测到我的项目中一个文件的两个版本之间发生冲突时,这意味着我的本地文件的版本号比远程存储库中同一文件的版本号小,因为另一个开发人员(p.e.John Smith)在我之前提交过(使用相同的初始版本号) 在分散的SCM(Mercurial、Git等)中,我没有中央存储库,那么: 我克隆了一个存储库,从远程服务器下载了一个文件的版本号 John Smith克隆相同的存储库,从远程服务器下载

我正在研究Mercurial,但我不明白它是如何检测文件冲突的

当一个集中式SCM(作为SubVersion)检测到我的项目中一个文件的两个版本之间发生冲突时,这意味着我的本地文件的版本号比远程存储库中同一文件的版本号小,因为另一个开发人员(p.e.John Smith)在我之前提交过(使用相同的初始版本号)

在分散的SCM(Mercurial、Git等)中,我没有中央存储库,那么:

  • 我克隆了一个存储库,从远程服务器下载了一个文件的版本号
  • John Smith克隆相同的存储库,从远程服务器下载相同版本的文件
  • 约翰·史密斯写了一点代码,并在当地做出了承诺
  • 之后,我承诺在我的地方
Git如何理解我们的文件是数字版本A的直接后代?
Mercurial/Git/Bazaar/etc没有一个内部编号来标识:他们如何理解修改后的文件是否冲突?

只有在您和John Smith相互通信(使用
hg push
hg pull
)并且其中一人希望合并这两行工作后,才会检测到任何冲突(使用
hg merge

将John Smith的更改拉入本地存储库后,更改集图可能如下所示:

... [a] --- [b]
       \
        `---------- [c]
当您创建了变更集
b
和约翰·史密斯创建了
c
,两者都基于变更集
a
。在
a
b
之间,您更改了文件
helloworld.c
,在
a
c
之间,约翰·史密斯更改了同一个文件。Mercurial现在能够判断出可能存在一种可能性l此处有冲突(重叠编辑),当您运行
hg merge
时,它会告诉您


系统不是基于与文件相关联的版本号,而是基于上述变更集图。具体来说,当您将
b
c
合并时,Mercurial将找到最大的共同祖先,即
a
。然后它将查看清单(文件列表(及其版本))存在于给定变更集中)在
a
b
c
中,请注意文件
helloworld.c
存在于三个不同的版本中。这告诉Mercurial它需要进行三方合并,其中
a
为基础版本,
b
c
为本地版本和其他版本。默认情况下,它会尝试执行以下操作:e内部合并,但如果失败,它将调用外部合并工具(如KDiff3)。

如果您真的想知道它是如何工作的,我建议您


简言之,Mercurial为每个版本创建一个唯一的标识符。它在所有存储库中都是唯一的,基于哈希。您和John Smith在存储库中都有相同的版本a标识符。您的本地更改将有不同的标识符。当您中的一人决定拉取和合并更改时,Mercurial将能够确定你们都对同一版本A进行了更改。这两个更改都与基础版本A进行了比较。然后很容易检查生成的修补程序是否冲突。

在DVCS上,每个repo克隆都有完整的历史记录日志,因此它总是知道谁是文件的父级。这可能会有所帮助。我已经给出了答案,但我觉得类似的问题最好在Mercurial邮件列表中回答:mercurial@selenic.com.在那里,您可以找到Mercurial开发人员,并可以提出后续问题。