答案 0 :(得分:33)
让我们将您的存储库视为“选择您自己的冒险书籍”,具有不同的观点。
答案 1 :(得分:23)
当您希望助记符(foo_feature)指向随着工作进展而更改的提交ID时,将使用书签。它们比普通的Mercurial分支更轻,有点类似于git分支的工作方式。
标签通常指向固定的提交ID。它们可以手动重新分配,但不鼓励这样做。
答案 2 :(得分:23)
实际上有五个概念可供使用:
如果你只使用mercurial会发生轻量级分支。您的存储库历史记录分叉,有时会在您更改内容并移动历史记录时进行合并。
其他四种是注释轻量级分支的方法以及构成它们的变更集。
命名分支和标记是仅限于mercurial的概念,其中分支名称和标记实际上通过对存储库进行更多提交而实际记录在存储库中。它们倾向于以不一定明显的方式传播到其他存储库。
本地标签和书签更像是git调用标签和分支。它们是元数据而不是与版本化对象混合在一起。因此,它们不会被表示为存储库历史记录的一部分。它们往往是您的存储库的本地存储,除非您故意传播它们,否则它们不会传播。
至少我认为这是他们的工作方式。在每天使用mercurial大约十二个月之后,我还没有真正掌握它的模型。如果有人比我更清楚,那么随时编辑这个答案,这是正确的。
我如何在实践中实际使用这些东西。
我正在与另外20个人合作开发一个共享存储库。我在自己的私有存储库中进行了许多实验和轻量级分支,它们永远不会被推送到我们的主要中央存储库。有时,一旦实验结束,我将修改主线并将变更集推送到中央存储库,从中可以找到其他人的机器。
如果他们是那些喜欢善变的人之一,我偶尔会把一些变更推给同事。但有几个人有点害怕它,如果我发送他们可以应用补丁的差异,我更喜欢。
对于实验我希望是短暂的和私人的,我只是让轻量级分支发生在他们可能的地方,并记住正在发生的事情。如果我感觉自己的记忆在一条已经存在的树枝上滑落,我会给它添加书签。
我使用本地标记来标记我可能想要回到某一天的修订版。他们使有趣的过去状态更容易找到。
我自己几乎从不制作非本地标签或命名分支(除非意外,如果我这样做,我会销毁它们)。但我们的发布人员会这样做我们发布的主要版本都在主线上有自己的命名分支,次要版本在这些分支上有标记。这确保了这些重要的分支和标签看起来与每个人相同。
同样,我不知道这是否应该如何使用mercurial,但它似乎是一个适合我们团队规模的模型。
如果我们中的三四个人想要在一个实验上合作,这可能值得一个命名的分支,我们可能会在自己之间分享但不会推送到中央回购。我不知道这会有多好用!
答案 3 :(得分:12)
最大的区别是提交时书签会自动向前移动。这是一个例子:
hg init
..edit a file..
hg commit -m 'my commit' # creates revision 0
hg tag -r 0 mytag # creates revision 1
hg bookmark -r 0 mybookmark # doesn't create a revision
hg update 0 # get back to r0
..edit a file..
hg commit -m 'another commit' # creates revision 2
此时mytag仍然指向修订版0,mybookmark现在指向修订版2.此外,标记创建了一个变更集,而书签则没有。
当然,书签也创建了一个revisio