嘿,我想恢复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
...
谢谢.
Mercurial故意不会让这很容易.Mercurial的思维方式是承诺的代码应该继续存在 - 没有成功的记录与记录的内容几乎同样重要.最好是对你的工作做出否定(这就是做什么backout
)并且仍然有记录而不是实际丢弃它.
但是,如果你不能保留这种改变(很好的理由:它包含你无法改变的密码,不好的理由:它只是没有成功)你有几个选择:
hg clone -r LASTCHANGESETYOULIKE oldrepo newrepo
,现在newrepo有一切,包括LASTCHANGESETYOULIKE.存档oldrepo并将newrepo重命名为oldrepo.这是怎么做的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上发布它:)
归档时间: |
|
查看次数: |
7239 次 |
最近记录: |