我在本地(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?
答案 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就可以了。