【问题标题】:Prevent unstable code going into default line防止不稳定的代码进入默认行
【发布时间】:2010-12-14 17:51:12
【问题描述】:

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

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

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

jstock-refactor-calendar-to-jodajstock 中提取之后,它的外观如下。

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

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

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

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

是不是我做错了什么?

【问题讨论】:

    标签: mercurial workflow dvcs branching-and-merging


    【解决方案1】:

    这也发布在 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
      

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

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

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

      hg update refactor-calendar-to-joda
      

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      来自Mercurial FAQ

      小费总是一个头。如果有 存储库中的多个头,仅 其中之一是小费。在一个 存储库,变更集已编号 依次,所以尖端有 最高序列号。这个单词 “tip”用作特殊标签 表示提示变更集,它可以 可在变更集 ID 或标签的任何地方使用 有效。

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

      hg update -r 12345
      

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

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

      【讨论】:

      • 我意识到当我更新到 12345 并执行提交时。稳定线再次成为默认值。谢谢。
      【解决方案3】:

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

      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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        相关资源
        最近更新 更多