防止不稳定的代码进入默认行

时间:2010-12-14 17:51:13

标签: mercurial workflow dvcs branching-and-merging

目前,我有2个存储库。一个存储库名为jstock,其中包含所有稳定的源代码。

另一个名为jstock-refactor-calendar-to-joda的存储库,它是从jstock克隆的,它包含所有不稳定的实验性功能代码。

红色矩形中的所有更改集都是不稳定的实验性功能代码。他们尚未完成。因此,我没有意图将它与绿色矩形中的变更集合并(绿色矩形表示那些是稳定的变更集)

jstock-refactor-calendar-to-jodajstock拉出后,这就是它的样子。 alt text

现在,我想让实验代码对jstock可见(但不会进入默认行,因为它们不稳定)

因此,当我从jstock-refactor-calendar-to-joda执行推送到jstock时,这就是我得到的。 alt text

现在所有不稳定的代码都属于默认行!

这不是我想要的。在jstock中,我希望稳定代码(绿色矩形)保持默认(左侧),不稳定代码(红色矩形)保持在右侧。请注意,我不希望它们合并,但我希望两个开发线(稳定和不稳定)可见。

我做错了什么步骤?

4 个答案:

答案 0 :(得分:3)

这也发布在Mercurial邮件列表上,下面是my reply

日志查看器中两个(匿名)分支的位置并不重要:没有左侧或右侧,顺序仅取决于您进行拉动和推动的顺序。

您需要的是一种标记来自稳定和不稳定分支的变更集的方法,以便您可以跟踪哪个是哪个。有三种主要方法:

  • 单独的克隆:这是您在不同分支中保留单独克隆时使用的简单方法。

    它的优点是只需删除克隆就可以轻松丢弃变更集。

    它的缺点是,由于变更集保持隔离,因此您无法全面了解所发生的情况。

  • 命名分支机构:如果您还没有这样做,请参阅我的指南:

    http://mercurial.aragost.com/kick-start/en/tasks/

    命名分支的优势在于它们将标签放入每个变更集中,以便您可以跟踪它们的来源。如果你有一个名为'refactor-calendar-to-joda'的命名分支,那么你可以做

    hg update refactor-calendar-to-joda
    

    以便将工作副本更新到该分支的提示。当在分支上进行新的提交时,分支尖端会移动,因此您可以将“refactor-calendar-to-joda”视为浮动标记。

    要返回默认分支,请执行

     hg update default
    

    这是正常发展应该发生的地方。

    命名分支对于在较长时间内保持稳定或者名称在多年后也有意义的分支是有用的。例如,如果您使用错误跟踪器,那么我建议创建一个错误来跟踪重构,然后调用分支'bug XX'。这样人们可以在将来查找正确的错误号。

  • 书签:书签为变更集提供名称,与命名分支一样,您可以更新为书签:

    hg update refactor-calendar-to-joda
    

    但是,与命名分支不同,书签位于变更集图之外。由于它们不属于更改集本身,因此可以移动,删除,重命名书签等。您可以在存储库之间推送和提取书签。

因此,对于长期持久性名称使用命名分支,对短期分支使用书签,如果要将事物分开,则使用单独的存储库。

最后,请参阅本指南,了解有关此主题的更多信息:

http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/

答案 1 :(得分:2)

在这种情况下,您必须在创建多个头时按下“强制”。 这两个这些头都在“默认”分支上。没问题,但是你担心的问题是你的新头(代码不稳定)是默认分支的“提示”。

来自Mercurial FAQ

  

小费始终是头脑。如果有   仅存储库中的多个头   其中一个是小费。在一个   存储库,变更集编号   顺序,所以尖端有   最高序列号。这个单词   “tip”作为特殊标记   表示提示变更集,它可以   可以在变更集ID或标记的任何位置使用   是有效的。

最好将这些更改推送到命名分支as Lasse suggests,但你就在那里。在这种情况下,您(或第一次拉动此存储库的任何人)需要将工作副本更新为默认分支的稳定部分。

hg update -r 12345

(其中12345是“而不是限制货币......”的修订号。

对于已经拥有此存储库的开发人员,当他们提取不稳定的更改时,他们将看到多个头,但他们的工作副本不会自动更新到您的新分支。

答案 2 :(得分:1)

你所做的一切都很好。你在同一个命名分支'default'上有两个头。这是一种完全正常的工作方式。这里有一个相当不错的描述:

http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/#branching-anonymously

正如尼克所暗示的那样,已经拥有克隆的人会在他们拉动时获得新的头脑,而新克隆的人将获得两者 - 这就没问题了。

当人hg update default或只是hg update他们移动到default分支上的最新变更集时,所以只需再执行一次“而不是限制货币小数位... “像这样改变其父母:

hg update REVSION
...edit
hg commit

它们将在克隆/更新时自动更新为您想要的匿名分支。

要记住的是,mercurial在命名分支之前已存在了很长时间,因此您可以使用匿名分支对命名分支执行所有操作。

如果你决定在回购中有两个无差别的头脑,那么考虑给书签一看。它们是跟踪匿名分支提示的粘性标签 - 比命名分支更灵活,因为它们不是永久性的。

http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/#branching-with-bookmarks

答案 3 :(得分:-1)

在这种情况下,您可能应该等待推送,并使整个存储库可用。

或者,当你开始分支时,你应该给它一个名字。您可以拥有多个未命名的分支,这些分支都属于同一个命名分支。

换句话说,您在那里看到的所有变更集都是default分支的一部分,但标签仅显示该分支的顶端。由于新的变更集现在是提示,因此标签在UI中显示。

如果你给它起了一个名字,那么默认分支上的最左边的变更集的默认值仍然会下降。

要解决这个问题,您必须逐个“重播”这些变更集。我不知道这样做的最好方法,但足以说它们会得到新的哈希值,所以任何已经取消这些变更集的人都有可能将它们作为默认分支的一部分推回去。