最大的区别是分支名称在历史记录中的记录方式。使用命名分支,分支名称将嵌入每个变更集中,因此将成为历史记录的不变部分。对于克隆,将不会永久记录特定变更集的来源。
这意味着克隆非常适合您不想记录分支名称的快速实验,而命名分支则适合长期分支(“ 1.x”,“ 2.x”和类似名称)。
还要注意,单个存储库可以轻松容纳Mercurial中的多个轻量级分支。可以将此类存储库中的分支添加书签,以便您可以轻松地再次找到它们。假设您已经如下所示克隆了公司存储库:
[a] --- [b]
您砍掉并制作[x]
并[y]
:
[a] --- [b] --- [x] --- [y]
这意味着当有人将[c]
其[d]
放入存储库时,因此当您拉入时,将获得如下历史记录图:
[x] --- [y]
/
[A B C D]
在单个存储库中有两个主管。您的工作副本将始终反映单个更改集,即所谓的工作副本父更改集。使用以下方法检查:
% hg parents
假设它报告[y]
。你可以看到头
% hg heads
这将报告[y]
和[d]
。如果您要将存储库更新为的干净签出[d]
,则只需执行以下操作([d]
用的修订号代替[d]
):
% hg update --clean [d]
然后,您将看到该hg parents
报告[d]
。这意味着您的下一次提交将具有[d]
父项。因此,您可以修复在main分支中发现的错误并创建更改集[e]
:
[x] --- [y]
/
[a] --- [b] --- [c] --- [d] --- [e]
[e]
仅推送变更集,您需要执行
% hg push -r [e]
[e]
变更集哈希在哪里。默认情况下,hg push
将简单地比较资料库和看到[x]
,[y]
和[e]
丢失,但您可能不希望共享[x]
和[y]
呢。
如果该错误修正也对您有影响,则要将其与功能分支合并:
% hg update [y]
% hg merge
这将使您的存储库图看起来像这样:
[x] --- [y] ----------- [z]
///
[a] --- [b] --- [c] --- [d] --- [e]
和[z]
之间的合并在哪里?您可能还选择了放弃分支:[y]
[e]
% hg strip [x]
这个故事的主要目的是:一个克隆可以轻松代表多个发展轨迹。对于不使用任何扩展名的“ plain hg”,这始终是正确的。不过,书签扩展名是一个很大的帮助。它将允许您为变更集分配名称(书签)。在上述情况下,您需要在开发头上有一个书签,在上游头上有一个书签。书签可以使用Mercurial 1.6 进行推拉,并已成为Mercurial 1.8的内置功能。
如果您选择制作两个克隆,那么在制作[x]
and 之后,您的开发克隆将看起来像这样[y]
:
[a] --- [b] --- [x] --- [y]
您的上游克隆将包含:
[a] --- [b] --- [c] --- [d]
您现在可以注意到该错误并进行修复。hg update
由于上游克隆已准备就绪,在这里您不必这样做。您提交并创建[e]
:
[a] --- [b] --- [c] --- [d] --- [e]
要将错误修正包括在您的开发克隆中,您可以将其放入其中:
[a] --- [b] --- [x]-[y]
\
[c] --- [d] --- [e]
并合并:
[a] --- [b] --- [x] --- [y] --- [z]
\ /
[c] --- [d] --- [e]
该图可能看起来有所不同,但结构相同,最终结果也相同。使用克隆,您必须减少精神记录。
命名分支实际上并没有出现在这里,因为它们是可选的。在我们改用命名分支之前,Mercurial本身是使用两个克隆开发多年的。除了“默认”分支外,我们还维护一个名为“稳定”的分支,并基于“稳定”分支进行发布。有关建议的工作流程的描述,请参见Wiki中的标准分支页面。