Mercurial分支修订历史,推动时有两个远程头部

Mercurial分支修订历史,推动时有两个远程头部,mercurial,Mercurial,我在本地提交了一系列变更集(23-28),然后我意识到我想返回到修订版25,所以我运行了“hg up-r25”返回。然后我从那里开始工作,并提交了一些变更集。现在我准备将我的更改推送到服务器,但当我尝试这样做时,它会抱怨“中止:推在分支“默认”上创建新的远程头!”。我认为其他人可能已经提交到了存储库,所以我进行了hg拉取,但没有得到任何更改 这是我正在使用的修订树 23 | 24 | 25 / \ 26 29 | | 27 30 | | 28 31 | 32

我在本地提交了一系列变更集(23-28),然后我意识到我想返回到修订版25,所以我运行了“hg up-r25”返回。然后我从那里开始工作,并提交了一些变更集。现在我准备将我的更改推送到服务器,但当我尝试这样做时,它会抱怨“中止:推在分支“默认”上创建新的远程头!”。我认为其他人可能已经提交到了存储库,所以我进行了hg拉取,但没有得到任何更改

这是我正在使用的修订树

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

是否可以删除修订版26、27和28?如何修复这些问题,使我可以运行“hg-push”而不出错?我是否应该使用不同的命令返回修订版25?

嗯,我知道有两种方法

注意:请进行备份或克隆以进行实验,我对任何丢失的工作不承担责任

首先,如果您启用了MQ扩展,那么可以去掉这些扩展。我只知道如何使用龟甲,但我会在这里发布后找到正确的命令

要执行此操作,请执行以下命令:

hg strip 26
hg clone SOURCEDIRECTORY CLONEDIRECTORY -r35

第二,您可以在本地创建一个新的克隆,只包含一些变更集,同样,我只知道如何使用TortoiseHg

要执行此操作,请执行以下命令:

hg strip 26
hg clone SOURCEDIRECTORY CLONEDIRECTORY -r35
然后,在验证克隆是否包含所需的更改集后,从克隆中推送到目标存储库



至于回答您应该做什么,您可以删除原始克隆并从服务器重新克隆,以获得一个只包含最多25个变更集的干净克隆,当然,您也可以使用strip命令来消除多余的变更集。

拥有多个磁头本身并没有什么问题-Mercurial只是检查它是否符合您的要求。在这种情况下,您可能希望保留放弃的开发路径以供将来参考。如果是这样,只需强制推(使用
hg-f push
)并创建放弃的分支。如果你只是想忘记一切,那就好了。

让我对Lasse的回答提出异议。Mercurial是一个关于建立不变历史的系统。想象一下,一位科学家在他或她的实验书上用钢笔写着有编号的页码。每件事都很重要,即使是那些你希望在这一刻不写也不想要的东西。strip命令在默认情况下没有启用是有原因的——它违反了mercurial目标的不变性

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

或者,您可以选择“hg push-r 35”,这不会给您任何警告或错误,也不会要求-f,因为您将只留下一个头部的回购


strip没有什么问题,但它不是Mercurial中传统工具集或思维方式的一部分。

是的,我在远程服务器上使用命令行。所以我喜欢命令行命令。虽然我同意这一点,但听起来他做了一些后悔的事情,在这种情况下,我确实认为从存储库中删除不正确的路径是正确的方法。就我个人而言,我可能会从原始存储库中重新克隆,只是删除了路径不正确的克隆,但由于他没有这样做,删除似乎很好。但是如果代码是好的,只是不是你现在想要使用的东西,那么我也会选择某种方式来保持它。无论如何,Mercurial在所有情况下都有选择,因此这里有很大的选择余地:)是的,这绝对是一个没有对错的方案,但有一种学派认为,您键入的任何字节都是一文不值的,即使是这样,也不是开发人员的决定。这不是适合每个人的正确操作模式,但这是Mercurial的默认操作模式,因此每当有人建议strip w/o也提供对位时,我都会提到它。有关如何进行这种一次性合并,请参阅。