我该如何管理“恢复”在mercurial中使用书签完成的分支?

时间:2012-10-27 03:46:42

标签: version-control mercurial dvcs

我在bitbucket上有一个开源项目。最近,我一直在研究一个实验性分支,我(无论出于何种原因)没有成为真正的分支。相反,我所做的就是使用书签。

所以我在同一版本中制作了两个书签

  • 测试 - 我现在处理的新代码现在应该被放弃(由于实验失败)
  • main - 有效的稳定旧代码
我在测试中工作过。我也从测试推送到我的服务器,最终将tip标签切换到新的不稳定代码,当我真的宁愿它留在主要。通过执行hg update main然后进行无关紧要的更改,我“切换”回主书签。所以,我用hg push -f推送了这个,现在我的源代码控制在服务器上是“正确的”。

我知道应该有一种更简洁的方法来“切换”分支机构。这种操作将来我该怎么办?

2 个答案:

答案 0 :(得分:1)

tip在具有任何类型分支的存储库中不是一个广泛有用的概念。无论您使用书签,命名分支还是匿名分支,tip始终表示任何分支上的最新提交,这很少是您关心的事情。解决问题的真正方法是不再担心tip

答案 1 :(得分:0)

我真的不明白你的问题,因为你正在切换(没有引号)分支,即使它们不是命名分支,当你使用书签时它们仍然是分支。

你犯的错误是一个诚实的错误,我认为没有办法让Mercurial再次使用书签(用不同的书签标记相同的版本并使用错误的书签进行标记)。我可以告诉你的是如何使用Mercurial 进行私人本地分支,这样你就可以避免产生后果:

您使用命名分支和阶段

Mercurial Phases 真的很甜蜜,让我快速解释一下。您可以将修订标记为三个称为阶段的特殊状态,它们是:secret,draft和public。

  1. 秘密:不要被推。可以通过历史编辑进行修改。
  2. 草稿:推送。可以通过历史编辑进行修改。这是任何修订的默认状态。
  3. 公开:推送。在对它们使用历史编辑扩展时会发出警告(strip,rebase,histedit,...)。
  4. 如上所述,默认情况下,所有本地修订都是 草稿,当您推送它们时,它们将变为 public 。您可以使用hg phase命令标记特定阶段的修订,但如果您从#3转到#2,或从#2转到#1(根据之前的编号),则需要-f迫使改变的论据是:

    秘密 - >草稿 - >公共

    要转到左侧,您需要使用--force或-f。

    以下是您的工作:

    hg branch experiment
    hg commit -m "Opening experimental branch" //say this creates revision 123
    hg phase -sf tip                           //s is for secret, f is for force
    //... hack hack hack
    hg commit -m "Uh oh screwed up here"
    hg push                                    //no secret revisions are pushed
    

    现在,你可以放弃那个分支并保持原样,它永远不会被推动。忘记它,甚至关闭它,这样当你列出你的分支时它不会打扰你。它不会被推,它不会被列出,所以不要担心它。

    但是,如果你有OCD,只需在分支被打开的提交处剥离(hg strip)分支,它就会消失:

    hg strip 123
    

    如果您已经有一个分支,您可以一次性修改几个版本:

    hg phase <start revision>::<end revision> -sf
    

    要使您的秘密分支草案或公开,只需将最新版本分阶段到这些阶段:

    hg phase -d tip    //assuming you are in the experiment branch
    

    然后推,分支将公开。

    Mercurial在改变历史的过程中变得越来越好,而没有改变它的劝阻的一般理念。阶段意在保护您免受意外的历史修改以及分享您不想要的内容。

    如何*我*使用书签

    就个人而言,我使用书签进行调试,以及何时我想尝试两种不同的做法。 对我来说,当您想要进行匿名分支(更新到以前的版本,提交并分叉历史记录)时,书签非常有用,但希望保持可理解的状态。