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

Gai*_*ama 7 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命令的引用不准确,因为命令没有完全相同的行为.

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

谢谢.

Ry4*_*ase 9

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

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

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


Mar*_*ler 7

这是怎么做的git reset --soft.我们假设你有一个这样的图:

... --- [A] --- [B] --- [X] --- [-X]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果需要,可以使用Mercurial 1.7为此创建别名:

[alias]
softreset = !hg update 'p1($1)' &&
             hg revert --all --rev $1 &&
             hg strip --force $1
Run Code Online (Sandbox Code Playgroud)

之后的脏工作副本hg revert使其有必要使用hg strip --force.您使用此新命令

$ hg softreset 10
Run Code Online (Sandbox Code Playgroud)

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

[alias]
reset = !test "$1" = "--hard" && hg strip $2 || hg softreset $2
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*gan 0

不确定 git 的事情,但如果你还没有推送,你可以使用hg rollback. 如果你已经推动了,那么你真的无能为力。

至于当前的修订版,请参阅hg id