4

我有一个关于 bitbucket 的开源项目。最近,我一直在研究一个实验分支,我(无论出于何种原因)并没有为它创建一个实际的分支。相反,我所做的是使用书签。

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

  • 测试——我工作的新代码现在应该被放弃(由于实验失败)
  • main -- 稳定的旧代码

我在测试中工作。我还从测试推送到我的服务器,最终将tip标签切换到新的不稳定代码,而我真的希望它留在 main。hg update main我通过执行 a然后提交了一个微不足道的更改来“切换”回主书签。所以,我推动了这个,hg push -f现在我的源代码控制在服务器上是“正确的”。

我知道应该有一种更清洁的方式来“切换”分支。这种手术以后应该怎么做?

4

2 回答 2

1

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

于 2012-10-29T21:15:16.080 回答
0

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

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

您使用命名的分支和阶段

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

  1. 秘诀:不要被推。可以通过历史编辑进行修改。
  2. 草稿:被推。可以通过历史编辑进行修改。这是任何修订的默认状态。
  3. public:被推送。在对它们使用历史编辑扩展(strip、rebase、histedit...)时会发出警告。

如前所述,默认情况下,所有本地修订都是草稿,当您推送它们时,它们会变为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

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

但是,如果您有强迫症,只需hg strip在打开分支的提交处剥离 () 分支,它就消失了:

hg strip 123

如果您已经有一个现有的分支,您可以像这样一次分阶段进行多个修订:

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

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

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

然后推送,分支就会公开。

Mercurial 在修改历史方面变得越来越好,而没有改变它不鼓励这样做的一般哲学。阶段旨在保护您免受意外的历史修改以及共享您不希望的内容。

*我*如何使用书签

就个人而言,我使用书签进行调试以及当我想尝试两种不同的方式来做一件事时。对我来说,当你想做匿名分支(更新到以前的版本、提交和分叉历史)但又想让事情变得容易理解时,书签很有用。

于 2012-10-27T09:32:21.553 回答