1

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

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

红色矩形中的所有变更集都是不稳定的实验特征代码。他们还没有完成。因此,我不打算让它与绿色矩形中的变更集合并(绿色矩形表示那些是稳定的变更集)

jstock-refactor-calendar-to-joda拉取后jstock,它是这样的。 替代文字

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

因此,当我执行 push from jstock-refactor-calendar-to-jodato 时jstock,这就是我得到的。 替代文字

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

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

有什么步骤我做错了吗?

4

4 回答 4

3

这也发布在 Mercurial 邮件列表上,下面是我的回复

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

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

  • 单独的克隆:这是您已经使用的简单方法,您可以为不同的分支保留单独的克隆。

    它的优点是您可以通过删除克隆轻松丢弃变更集。

    它的缺点是您无法真正全面了解正在发生的事情,因为变更集是孤立的。

  • 命名分支:如果您还没有这样做,请在此处查看我的指南:

    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
    

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

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

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

    hg update refactor-calendar-to-joda
    

    但是,与命名分支不同,书签位于变更集图之外。因为它们本身不是变更集的一部分,所以可以移动、删除、重命名书签等。您可以在存储库之间推送和拉取书签。

因此,将命名分支用于长期持久名称,将书签用于短期分支,如果您希望将事物分开,请使用单独的存储库。

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

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

于 2010-12-15T16:14:50.227 回答
2

在这种情况下,您必须在创建多个头时推动“力”。这两个头都在“默认”分支上。这样做没有问题,但您担心的问题是您的新负责人(具有不稳定的代码)是默认分支的“提示”。

来自Mercurial 常见问题解答

小费总是一个头。如果存储库中有多个头,则其中只有一个是提示。在存储库中,变更集按顺序编号,因此提示具有最高的序列号。单词“tip”作为一个特殊的标签来表示提示变更集,它可以在变更集 ID 或标签有效的任何地方使用。

正如 Lasse 建议的那样,将这些更改推送到一个命名的分支会更好,但你就在你所在的位置。在这种情况下,您(或任何第一次提取此存储库的人)需要将工作副本更新到默认分支的稳定部分。

hg update -r 12345

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

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

于 2010-12-15T12:16:21.093 回答
1

你所做的一切都很好。您在同一个名为“默认”的分支上有两个头。这是一种完全正常的工作方式。这是对正在发生的事情的相当不错的描述:

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 已经存在了很长时间,因此您可以使用命名分支执行的所有操作都可以使用匿名分支执行。

如果您决定在该 repo 中有两个未区分的头像太令人困惑,请考虑查看书签。它们是跟踪匿名分支提示的粘性标签——比命名分支更灵活,因为它们不是永久性的。

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

于 2010-12-15T16:19:14.453 回答
-1

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

或者,当你启动那个分支时,你应该给它一个名字。您可以拥有多个未命名的分支,它们都属于同一个命名的分支。

换句话说,您看到的所有变更集都是default分支的一部分,但是标签仅显示在该分支的尖端。由于新的变更集现在是提示,这就是标签在 UI 中显示的位置。

如果你给它起了一个名字,那么 default 仍然会在你的默认分支上最尖端的变更集上被关闭。

要解决这个问题,您必须一一“重播”这些变更集。我不知道做到这一点的最佳方法,但只要说他们会获得新的哈希值就足够了,所以任何已经拉出这些变更集的人都已经冒着将它们作为默认分支的一部分推回的风险。

于 2010-12-14T18:04:55.467 回答