hg tag和hg bookmark有什么区别?

67

3
您可能会发现这篇关于Mercurial分支的指南非常有帮助:http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ - alexandrul
4个回答

33

考虑将您的存储库视为一个“选择自己的冒险书”,具有不同的视角。

  • 标签就像编辑员在您的手稿上放置的印章,表示“好的,我们保留您当前的工作痕迹,以防出现问题。”
  • 命名分支就像是一章。您必须在某个时刻选择要写的章节,并且它们会一直存在。有些将合并回来,有些则会结束(对不起,您死了)。
  • 书签就像是一个书签。当您阅读(提交)该书时,它会跟随您。它可以帮助您跟踪“您当时正在阅读什么内容”,因此您可以将其删除、移动到另一个“章节”。当您共享这本书(推送)时,通常不会分享您的书签,除非您明确希望这样做。因此,您通常会在匿名分支上使用它们,因为它们的生命周期比命名分支短。

9
一个意想不到的类比 O_O - Matt Joiner
38
我不理解这个比喻。我是在写书还是阅读别人正在写的书?出版商版本是否控制手稿?他是盖我的副本还是他的?我是在写手稿,还是复印它们?用涂改带处理它们?还是在电脑上进行并进行版本控制? - John Lawrence Aspden
20
这个类比有些令人困惑,需要进行修改。试试这个。你正在阅读一本书。1页=1个变更集。
  • 标签就像在你觉得有趣的页面上贴便利贴。它会停留在同一页,并可用于轻松找到该页。
  • 命名分支就像是章节。每一页都有写在边距上的章节编号。这将相关的页面分组在一起。
  • 书签就像是书签。当你从一页移到另一页时,将书签随着你一起向前移动。你可以使用多个书签来跟踪不同部分的进度。
- 00dani
9
我发现比起直接解释,这个比喻更令人困惑。(标签:用于特定变更集的标签;是存储库永久历史记录中的变更集的一部分。书签:指向分支末端的指针;与变更集分开存储,并有时被比作Git中的“轻量级”分支。) - Giscard Biamby
我发现这个比喻不如 Matthew Flaschen 的回答 有用。 - Sled
3
如果你已经对事情是如何运作有一两个想法,那么这个答案非常好。我认为这很好。 :) - Florian Pilz

24

当您的工作进展时,书签可用于指向一个不断变化的提交ID的助记符(foo_feature)。它们比常规的Mercurial分支更轻巧,有些类似于Git分支的工作方式。

标签通常指向固定的提交ID。它们可以手动重新分配,但不建议这样做。


更轻量级?我有点困惑,因为我主要使用svn,其中分支和标签只是相同实现的不同约定。 - Jason S
1
@Jason,这有点棘手。在我了解足够的git进行比较之前,我不认为我真正理解了。然而,基本思想是,在重型分支中,分支名称是更改集的(不可变)属性。对于轻量级分支,分支名称是特定更改集的移动别名。我建议阅读BranchGitConcepts,两者都在Mercurial wiki上。 - Matthew Flaschen

24

实际上有五个概念可以使用:

  • 标签
  • 本地标签
  • 书签
  • 轻量级分支
  • 命名分支

轻量级分支是如果只使用Mercurial,则会发生的情况。您的存储库历史记录会分叉并在更改事物并移动历史记录时合并。

其他四个概念是注释轻量级分支及其组成的更改集的方法。

命名分支和标签是仅适用于Mercurial的概念,其中分支名称和标签实际上通过向存储库添加更多提交来记录在存储库中。它们往往会以不一定明显的方式传播到其他存储库。

本地标签和书签更像Git称为标签和分支的内容。它们是元数据,而不是混合在版本化对象中的内容。因此,它们不表示为存储库历史记录的一部分。它们倾向于局限于您的存储库,并且除非您故意传播它们,否则不会传播。

至少我认为它们都是如何工作的。在每天使用Mercurial约12个月后,我还没有完全掌握它的模型。如果有人比我更了解,请随意编辑此答案,使其正确。


实际上我如何在实践中使用这些内容。

我正在与其他约20个人共享一个单一的存储库。我在自己的私有存储库中进行了许多实验和轻量级分支,这些内容从未推送到我们的主中央存储库。偶尔,一旦实验成功,我会修改主线并将更改集推送到中央存储库,从中它将找到每个人的机器。

如果某些人熟悉Mercurial的工作方式,我偶尔会向同事推送一些更改集。但是有几个人对它有点害怕,他们更喜欢我发送可以使用patch应用的差异。

对于我希望短暂存在且私有的实验,我只是让轻量级分支发生在可能出现的地方,并记住正在发生的事情。如果我感觉我的记忆力有点下降,那就把它加入书签。

我使用本地标签来标记我可能会在未来某一天回顾的版本。它们使得找到有趣的过去状态更加容易。

关于非本地标签或命名分支,我自己几乎从不使用(除非是不小心创建了,那我会将其删除)。但我们的发布团队会使用它们。我们发布的主要版本都有自己的命名分支,而次要版本则在这些分支上打标签。这确保了所有人都可以看到这些重要的分支和标签。

再次强调,我不知道这是否是使用Mercurial的正确方法,但对于我们这样的团队来说,这似乎是一个行之有效的模式。

如果我们三四个人想要合作进行实验,那可能值得创建一个命名分支。我们可能会在彼此之间共享该分支,但不会将其推送到中央仓库。我不知道这样做是否可行!


1
你可能想考虑使用hg-flow,它非常有用。 - nasch
如果您创建了一个功能分支或书签,但该功能从未合并到主分支中,那该怎么办呢?如果想要清理存储库,这时候最佳实践是什么? - monkeyjumps

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个版本。同时,标签创建了一个变更集(changeset),而书签没有。

另外,当然,书签创建了一个版本(revision)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接