Mercurial变化的传播

时间:2011-11-23 06:33:52

标签: version-control mercurial

我有一个问题。假设我有一堆托管形成层次结构的存储库,例如:A - > B - > C(意思是A是中央存储库,其余的都是它的后代)。

现在假设我使用C的克隆。假设我想要不仅从C获取更改,而且从中央存储库获取更改,因此我执行以下命令:

hg pull [Address of A]
hg up

这似乎完全合法,但是当我提交更改并将其推送到C后会发生什么?不仅会推送我的本地修改,还会修改中央存储库(如果有的话)。如果有人试图将变化从A拉到C,会发生什么?是否存在冲突或者它将成功合并变更A - >本地 - > C改变A - >; C. Mercurial是否会将其视为相同的变更集?

如果我确定我的代码足够稳定并且可以放在中央存储库中,则会发生相同的情况:

hg commit -u spirit -m "A local modification that is stable"
hg push [Address of A]

如果我从A拉到C然后再从C拉到我的本地仓库会发生什么,它会将这些变更集识别为源自我的本地仓库,还是会报告冲突并建议合并?< / p>

无论如何,这种情况下的最佳做法是什么?仅执行后续的拉动和推动(即A - B,B - C,C - 本地)?但问题是我只能访问我的本地存储库,它是C的克隆。如果我想要在我的本地机器上,如何从B到C的拉? Mercurial如何处理

2 个答案:

答案 0 :(得分:5)

  

如果有人试图将更改从A拉到C,会发生什么?是否存在冲突或者它将成功合并变更A - &gt;本地 - &gt; C改变A - >; C. Mercurial是否会将其视为相同的变更集?

C中已存在的更改集将被视为已存在,因为它们的ID已经存在。这就是改变不可改变的原因。如果您可以修改变更集,则其ID将更改(ID是变更集内容的散列)。 Mercurial然后(正确地)将其视为不同的变更集。通过保持变更集不可变,我们可以确定它们的散列将与它们来自哪个repo相同。

  • pull =从那里复制具有我尚未见过的ID的变更集
  • push =将更改集复制到那些具有他们尚未看到的ID的
  

是否会发生冲突

没有

  

或它将成功合并更改A - &gt;本地 - &gt; C改变A - >;下进行。

没有合并,因为它们是相同的更改。它只是看到它已经拥有它们。

除非您想要组合来自两个并行更改集的更改,否则不会发生合并,除非您明确要求更改。

答案 1 :(得分:1)

只要变更集相同,即它们具有相同的id散列。 Mercurial认为它们是相同的。

使用rebase或mq命令修改变更集时,id散列会发生变化,mercurial可能会将两个非常相似的变更集放入存储库。