如何在mercurial中还原1个或多个已提交的文件,但不是整个变更集

时间:2011-02-24 06:07:09

标签: mercurial

说我有文件File_AFile_BFile_C。我故意编辑File_AFile_B,但File_C我刚刚添加了一些我不打算提交的调试代码。然后偶然我做了

hg commit -m "comment"

如何恢复/回滚/退出File_C?基本上我很高兴能够去

hg update -r <oneRevBack> File_C
hg commit -m "put C back"

但更新不会使用过滤器AFAIK,因此它也会恢复File_AFile_B。我可以复制File_C某处,hg update,然后将其复制回来,但这似乎很蹩脚。有没有办法在Mercurial中直接执行此操作?

5 个答案:

答案 0 :(得分:30)

如果您使用hg revert代替hg update

,那么您想要使用的确切命令就会有效
hg revert -r .^ File_C
hg commit -m "put C back"

答案 1 :(得分:7)

在大多数情况下,VonC的解决方案非常完美。但是,如果回滚不是选项(例如因为有问题的提交不是最后一个,或者因为你进行了复杂的部分提交),那么你可以使用不需要的更改的反向差异进行新的提交File_C

hg diff -c REVISION --reverse File_C | hg import -m "Revert changes to File_C" -

其中REVISION指的是意外提交File_C的提交。第一个命令为相关文件生成反向差异。它的输出通过管道传输到hg import(不要忘记尾随-)。

更新:您还可以使用退出命令:

hg backout -I File_C REVISION
hg commit -m "Revert changes of File_C in REVISION" File_C

backout命令会更改您的工作副本,因为它会撤消对rev中提交的File_C的更改。 REVISION。然后明确提交恢复。

答案 2 :(得分:3)

您可以使用 hg rollback 撤消上次提交,然后重新执行此操作,这次没有文件C
(如Mercurial FAQ中所述,以及此FAQ entry中注意到“回滚事务时没有备份”,因此请谨慎使用)

答案 3 :(得分:2)

hg revert FILE -r REVISION

您可以通过

将其还原为上次提交
hg revert FILE -r .~1

答案 4 :(得分:0)

您还可以使用交互模式:

hg revert -i -r .^

选择要还原的内容并确认。

hg amend