Hg:删除最新提交

时间:2011-11-19 16:16:21

标签: mercurial undo

我过去曾经使用过Git,而且我是一名Hg noob:

我有以下存储库结构:

o [> default] commit A
|
o commit B
.
.
.
o <a-tag]
|

我已使用a-tag更新到提交,并提交了一些其他提交。现在我有了

o [> default] commit C
|
o commit D
|
|  o [default] commit A
|  |
|  o commit B
|  .
|  .
|  .
| /
o <a-tag]
|

现在(在推送之前)我意识到我根据错误的提交提交了我的提交commit Ccommit D。如何才能返回初始状态(无需重新克隆存储库),将这些提交commit Ccommit Dgit reset --hard a-tag的吊坠)丢弃?

4 个答案:

答案 0 :(得分:8)

您可以使用'strip'永久删除提交及其所有后代。在您的情况下,您需要指定“D”版本的ID:

hg strip -r D

注意:必须打开mq扩展名:

[extensions]
mq=

Mercurial备份.hg / strip-backup中剥离的变更集的捆绑包,因此此操作相当安全。

答案 1 :(得分:4)

你说没有克隆,我会接受,但首先让我指出这样做:

cd ..
hg clone -r -2 yourrepo yournewrepo

是一个即时操作,可以在本地为您提供一个新的克隆,而无需在旧存储库中进行最后两次提交。因为它是本地克隆,所以它使用硬链接(甚至在Windows上),因此存储库不会占用额外的磁盘空间。

这是经典的Mercurial解决方案。 Mercurial建立在一个不可改变的历史的基础上。如果历史中有什么东西你后悔你提交它的逆(这是backout的作用),所以历史记录显示错误及其修正 - 就像科学家的日志一样。如果你不能/不能在历史中遵守它,你就会像我上面所展示的那样做一个排除它的克隆。

不是每个人都可以如此......硬核......关于他们的历史,所以很多扩展已经出现,将修改历史,但必须特别启用。在您的情况下,您已安装的rebase扩展程序(现在随附Mercurial)将完全按照您的要求执行。您只需要在~/.hgrc中启用它,然后将D重新映射到A.如果您真的只想要C消失,strip扩展名中的mq命令就会这样做。它还附带Mercurial。

答案 2 :(得分:1)

我只是从适当的点克隆并删除旧的仓库。 如果没有克隆,请考虑hg backout撤消第一个C然后撤消D,或者,如果这是您的最终目标hg rebase,则将C和D都移动到commit A点。

答案 3 :(得分:1)

Backout C + backout D将删除这两个提交,但添加额外的3(退出+退出+合并)。 “清理”从历史中删除可能

如果您只想更改错误的父级更正,则必须使用rebase,如@chill所述