如何摆脱Hg中的一些变化?

时间:2010-11-13 13:34:18

标签: git mercurial

嘿,我想恢复Hg中的一些变更集,但我很难这样做。

我偶然提交了一些更改,所以我想撤消这一点。尝试了一下后,我能够hg backout,但它创建了一个新的提交。现在,我希望我的repo成为初始状态(没有最后两次提交,并且我在工作目录中进行了更改)。显然没有办法做到这一点(类似于git reset --soft)。有吗?

我尝试的另一件事是摆脱最新的提交(恢复原始提交的提交)。这将类似于git reset --hard,但同样,没有办法做到这一点。我可以hg update -C,但更像是git checkout,因为提交仍在那里。

而且,hg update -C -r X还原我回到修订版X,但当我检查hg log时,我无法知道我现在正在修改哪个版本。唯一的方法是检查我的bash历史,这是对的吗?必须有办法知道这一点。

无论如何,我一直试图解决这个问题一段时间,但找不到任何可以解决它的问题。我发现比较git和hg命令的引用不准确,因为命令没有完全相同的行为。

我想我只是想知道git reset --hard git reset --soft的hg中的REAL等价是什么......

感谢。

5 个答案:

答案 0 :(得分:9)

Mercurial故意不会轻易做到这一点。 Mercurial的思维方式是承诺的代码应该继续存在 - 没有成功的记录与记录的内容几乎同样重要。最好是对你的工作进行否定(这是backout所做的)并且仍然有记录而不是实际丢弃它。

但是,如果你不能保留这种改变(很好的理由:它包含你无法改变的密码,不好的理由:它只是没有成功)你有几个选择:

  • strip:我不喜欢它修改存储库并且不会将这些东西放回工作目录中。出于某种原因,默认情况下禁用Strip。
  • 克隆:只需做一个hg clone -r LASTCHANGESETYOULIKE oldrepo newrepo,现在newrepo包含LASTCHANGESETYOULIKE的所有内容。存档oldrepo并将newrepo重命名为oldrepo。
  • rollback:这是mercurial世界的一级撤消。它会在你做完之后撤消你的提交,但是如果你做了任何其他的拉动或提交,它就不起作用了。

答案 1 :(得分:7)

以下是git reset --soft的操作方法。我们假设您有一个这样的图表:

... --- [A] --- [B] --- [X] --- [-X]

其中X是错误提交,而-X是您的撤销。您现在想要摆脱X-X,同时保留工作副本,就像您提交X时一样。你做了

$ hg update B
$ hg revert --all --rev X # working copy now looks just like in X
$ hg strip --force X      # get rid of X and -X

如果需要,可以使用Mercurial 1.7为

创建别名
[alias]
softreset = !hg update 'p1($1)' &&
             hg revert --all --rev $1 &&
             hg strip --force $1

hg revert之后的脏工作副本使得必须使用hg strip --force。您将此新命令用作

$ hg softreset 10

将删除10和任何后代,同时将工作副本中的更改保留为10。您当然可以进一步实现hg reset命令:

[alias]
reset = !test "$1" = "--hard" && hg strip $2 || hg softreset $2

这些别名的最大问题是错误处理不佳。用Python编写的扩展将更加健壮和可维护 - 也许你可以制作这样一个“重置”扩展并在Bitbucket上发布它:)

答案 2 :(得分:3)

请参阅hg strip扩展程序中的mq

答案 3 :(得分:1)

你已经有了一些好的答案,但还有一些补充说明:

  • 如果您有未提交的本地更改,搁置会将它们放在一边供您以后再检索
  • 如果您的变更集已被推送到另一个存储库,那么除了编辑这两个存储库之外,退出是您唯一的选择
  • 回退允许您创建一个新的变更集,该变更集与原始变更集相反,在不更改存储库历史记录的情况下消除不需要的变更
  • 如果您还没有推送到远程仓库,回滚通常是您的最佳选择,因为它会在保留工作副本的同时删除变更集
  • Strip将摆脱整个变化的分支,但是如果你没有在其他任何地方推动变化,那么它就会停止消失
  • 将存储库克隆到先前版本也是如此 - 其他工具也更容易

答案 4 :(得分:0)

不确定git的东西,但如果你没有推,你可以使用hg rollback。如果你已经推动了,你可以做的事情真的不错。

关于当前版本,请参阅hg id