2010-11-05 74 views
4

我犯了一堆本地变化集(23-28),然后我意识到我想回到修订版25,所以我跑了“hg up -r 25”到回去。然后我开始从那里开始工作,并做了一些改变。现在我准备将我的更改推送到服务器,但是当我尝试这样做时,它会抱怨“abort:push在分支上创建新的远程头'默认'!”。我以为别人可能已经承诺存储库,所以我做了一个hg拉,但没有得到任何改变。Mercurial分支修订历史,两个远程头推时

这里是我与

23 
| 
24 
| 
25 
/\ 
26 29 
| | 
27 30 
| | 
28 31 
    | 
    32 
    | 
    33 
    | 
    34 
    | 
    35 

工作的版本树是否可以删除修订26,27和28?我怎样才能解决问题,以便我可以无误地运行“hg push”?我是否应该使用其他命令返回修订版本25?

回答

3

嗯,有两种方法我知道。

注意:请做好备份,或实验上的克隆,我不采取任何丢失工作

第一责任人,如果你有启用MQ扩展,你可以去除那些关闭。 我只知道如何使用TortoiseHg来做到这一点,但在发布这里后我会找到正确的命令。

要做到这一点,你会执行此命令:

hg strip 26 

其次,你可以在本地的只能创建一个新克隆的一些变更集 的,再次我只知道怎么做使用TortoiseHg

要做到这一点,你会执行此命令:

hg clone SOURCEDIRECTORY CLONEDIRECTORY -r35 

然后,从你的克隆,验证它包含所需的变更后,你推针对目标存储库。


至于回答你应该怎么做了,而不是,你可以已经删除了自己原有的克隆,并从服务器再克隆得到一个干净的克隆只含有多达25变更集,但你当然可以然后使用strip命令来摆脱多余的变更集。

+0

是的,我在远程服务器上使用命令行。所以我想要命令行命令。 – 2010-11-05 20:27:57

+0

谢谢,hg strip命令完美工作。 – 2010-11-05 20:46:44

1

有多个负责人没有什么天生的错误 - Mercurial只是检查它是你想要的。在这种情况下,您可能希望保留废弃的开发路径以供将来参考。如果是这样,只需强制推送(使用hg -f push)并创建废弃分支。如果你只是想忘记一切,@Lasse's answer就好了。

5

让我对拉斯的答案发表不同意见。 Mercurial是一个关于建立一个不可改变的历史的系统。想想一个在他或她的实验室工作的科学家在笔中编号的页面。一切都很重要,即使是你希望你没有写的东西,也不想在这一秒。 strip命令默认情况下没有启用 - 这违反了mercurial目标的不可变性。

解决这个问题的更多“Mercurial”方法是将26合并到35中,完全从35中选择选项,这样您就回到了一个头部。那么你的推动仍然只有一个头,但所有的历史都保存下来。

或者,您可以选择'hg push -r 35',它不会给出任何警告或错误,也不需要-f,因为您只需要一个头离开回购仓库。

带子没什么问题,但它不属于传统工具集或Mercurial的心态。

+0

虽然我确实同意这一点,但听起来他已经做了一些他后悔的事情,在这种情况下,我确实认为从存储库中删除不正确的路径是正确的选择。就我个人而言,我可能已经从原始存储库重新克隆,并删除了不良路径的克隆,但由于他没有这样做,删除似乎很好。但是,如果代码是好的,只是不是你现在想用的东西,那么坚持下去的方式也是我的第一选择。在任何情况下,Mercurial都有适用于所有情况的选项,所以在这里有足够的空间供选择:) – 2010-11-06 13:05:36

+0

是的,这绝对是一个没有对错的方案,但是有一种学派认为没有你输入的字节是毫无价值的,即使是这样,这也不是开发人员做出的决定。对于每个人来说这都不是正确的操作模式,但它是Mercurial的默认操作模式,所以每当有人建议脱衣舞不提供对应点时,我都会提醒它。 – 2010-11-06 19:06:16

+0

请参阅https://stackoverflow.com/questions/7475634/mercurial-any-way-to-merge-and-discard-changes以了解如何执行此一次性合并。 – Perseids 2015-12-16 16:45:41