关于Mercurial的快速提问。假设我的同事和我都有最新的主干副本。我们都做出了改变,然后我们都推动/拉动彼此之间的变化。
我猜测Mercurial会根据提交日期按顺序保留更改(因为没有递增修订,只有GUID)。那么如果我的计算机的日期落后一天并且我在同事之后花了半天时会发生什么呢。我的变化会在我同事的前半天出现吗?
答案 0 :(得分:7)
@Martijn有正确答案,但似乎没有点击。如果这让任何事情变得清晰,请选择他的:
Mercurial和其他DVC完全基于DAG(有向无环图)进行所有历史跟踪,这意味着:
在您提交之前,您可以通过键入hg parents
来查看变更集的父级是什么,一旦您提交,就可以在hg log
中看到它。
在您的示例中,如果您已拉出同事的更改集并更新了工作目录以反映它们(hg pull ; hg update
),那么他或她的变更集将成为您的变更集的父级。如果你没有提取/更新以反映他或她的变更集,那么你的两个变更集将拥有相同的父级 - 他们将成为兄弟姐妹 - 当它们合并时,它们都不会以任何方式优先于另一个。
执行hg log
时的排序取决于变更集到达您的本地存储库的顺序,并且可能因repo到repo的不同而不同,具体取决于他们提取的位置从一开始 - 这就是为什么你不能使用变更集旁边显示的整数来进行交叉回购操作 - 只有散列是全局的。
简而言之,日期从不在正常操作中查阅,并且纯元数据,与作者或提交说明没有更多相关性。
答案 1 :(得分:6)
实际上,您的更改集已加上时间戳(内部存储为自UNIX-epoch以来的秒数和时区偏移量),并且在显示更改集时,它们按时间戳排序,并且您的更改集将显示在错误的位置作为其时间戳不正确。见https://www.mercurial-scm.org/wiki/ChangeSet
但这并不是一个问题;时间戳与您的更改与您的同事的更改无关。此处仅更改变更集ID,并且在使用合并共同祖先时。它将跟随您的变更集的图表,查找您的同事也拥有的变更集ID,然后将您和他的变更合并到前面。见https://www.mercurial-scm.org/wiki/Merge
因此,合并不会受到影响,只会显示变更集,您的变更集将被排序到错误的位置。它会让你和你的同事感到困惑,但你的改变本身就是安全的。
答案 2 :(得分:4)
更改集的顺序不受更改集中时间戳的影响。订单仅由在本地存储库中创建更改集的顺序确定。
Mercurial有一个仅附加架构,因此当您从另一个存储库拉出时,您引入的更改集将放在您自己的更改集之后,而不管新更改集中的时间戳。
修订号(本地整数计数器)只是一个计数器:每个新的变更集都会获得下一个可用的修订号。 Mercurial中的简单范围运算符直接用于修订数字,因此X:Y
表示“给我带有从X到Y(包括)的修订号的变更集”。当修订号仅基于创建变更集或将其拉入存储库的顺序时,这不太有用。
使用X::Y
代替,它为您提供X的后代和Y的祖先的变更集,即它跟随历史记录中的分支。