我偶然提交了一些更改,所以我想撤消这一点。尝试了一下后,我能够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等价是什么......
感谢。
答案 0 :(得分:9)
Mercurial故意不会轻易做到这一点。 Mercurial的思维方式是承诺的代码应该继续存在 - 没有成功的记录与记录的内容几乎同样重要。最好是对你的工作进行否定(这是backout
所做的)并且仍然有记录而不是实际丢弃它。
但是,如果你不能保留这种改变(很好的理由:它包含你无法改变的密码,不好的理由:它只是没有成功)你有几个选择:
hg clone -r LASTCHANGESETYOULIKE oldrepo newrepo
,现在newrepo包含LASTCHANGESETYOULIKE的所有内容。存档oldrepo并将newrepo重命名为oldrepo。答案 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)
你已经有了一些好的答案,但还有一些补充说明:
答案 4 :(得分:0)
不确定git的东西,但如果你没有推,你可以使用hg rollback
。如果你已经推动了,你可以做的事情真的不错。
关于当前版本,请参阅hg id
。