Mercurial分支修订历史,推动时两个偏头

时间:2010-11-05 20:19:50

标签: mercurial

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

这是我正在使用的修订树

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

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

3 个答案:

答案 0 :(得分:5)

让我在Lasse的回答中发出不同意见。 Mercurial是一个关于构建不可变历史的系统。想想一位科学家在他或她的实验室工作书中用笔在数字页面上工作。一切都很重要,即使是你希望你没有写的东西,也不想在这一秒。默认情况下,strip命令没有启用,原因是它违反了不可变性这个多变的目标。

解决这个问题的更多“Mercurial”方法是将26合并为35,完全选择35中的选项,这样你就可以回归到一个头。然后你的推动仍然只有一个头,但所有的历史都被保留。

或者你可以选择'hg push -r 35',它不会给你任何警告或错误,也不需要-f因为你只有一个头就离开了repo repo。

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

答案 1 :(得分:3)

嗯,我知道两种方式。

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

首先,如果启用了MQ扩展,则可以将其删除。 我只知道如何使用TortoiseHg,但我会在发布后找到正确的命令。

为此,您将执行以下命令:

hg strip 26

其次,你可以在本地创建一个只有部分变更集的新克隆,再次我只知道如何使用TortoiseHg

为此,您将执行以下命令:

hg clone SOURCEDIRECTORY CLONEDIRECTORY -r35

然后,在您的克隆中,在验证它包含您想要的更改集后,您将推送目标存储库。


至于回答你应该做的事情,你可以删除原始克隆并从服务器重新克隆以获得仅包含变更集25的干净克隆,但当然你可以使用strip命令那么也要摆脱多余的变化。

答案 2 :(得分:1)

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