Mercurial中,标签(tag)和书签(bookmark)有什么区别?我找不到任何讨论这两者差异的信息。
Mercurial中,标签(tag)和书签(bookmark)有什么区别?我找不到任何讨论这两者差异的信息。
考虑将您的存储库视为一个“选择自己的冒险书”,具有不同的视角。
当您的工作进展时,书签可用于指向一个不断变化的提交ID的助记符(foo_feature)。它们比常规的Mercurial分支更轻巧,有些类似于Git分支的工作方式。
标签通常指向固定的提交ID。它们可以手动重新分配,但不建议这样做。
实际上有五个概念可以使用:
轻量级分支是如果只使用Mercurial,则会发生的情况。您的存储库历史记录会分叉并在更改事物并移动历史记录时合并。
其他四个概念是注释轻量级分支及其组成的更改集的方法。
命名分支和标签是仅适用于Mercurial的概念,其中分支名称和标签实际上通过向存储库添加更多提交来记录在存储库中。它们往往会以不一定明显的方式传播到其他存储库。
本地标签和书签更像Git称为标签和分支的内容。它们是元数据,而不是混合在版本化对象中的内容。因此,它们不表示为存储库历史记录的一部分。它们倾向于局限于您的存储库,并且除非您故意传播它们,否则不会传播。
至少我认为它们都是如何工作的。在每天使用Mercurial约12个月后,我还没有完全掌握它的模型。如果有人比我更了解,请随意编辑此答案,使其正确。
实际上我如何在实践中使用这些内容。
我正在与其他约20个人共享一个单一的存储库。我在自己的私有存储库中进行了许多实验和轻量级分支,这些内容从未推送到我们的主中央存储库。偶尔,一旦实验成功,我会修改主线并将更改集推送到中央存储库,从中它将找到每个人的机器。
如果某些人熟悉Mercurial的工作方式,我偶尔会向同事推送一些更改集。但是有几个人对它有点害怕,他们更喜欢我发送可以使用patch应用的差异。
对于我希望短暂存在且私有的实验,我只是让轻量级分支发生在可能出现的地方,并记住正在发生的事情。如果我感觉我的记忆力有点下降,那就把它加入书签。
我使用本地标签来标记我可能会在未来某一天回顾的版本。它们使得找到有趣的过去状态更加容易。
关于非本地标签或命名分支,我自己几乎从不使用(除非是不小心创建了,那我会将其删除)。但我们的发布团队会使用它们。我们发布的主要版本都有自己的命名分支,而次要版本则在这些分支上打标签。这确保了所有人都可以看到这些重要的分支和标签。
再次强调,我不知道这是否是使用Mercurial的正确方法,但对于我们这样的团队来说,这似乎是一个行之有效的模式。
如果我们三四个人想要合作进行实验,那可能值得创建一个命名分支。我们可能会在彼此之间共享该分支,但不会将其推送到中央仓库。我不知道这样做是否可行!
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个版本。同时,标签创建了一个变更集(changeset),而书签没有。
另外,当然,书签创建了一个版本(revision)。