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

gma*_*man 29 mercurial

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

hg commit -m "comment"
Run Code Online (Sandbox Code Playgroud)

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

hg update -r <oneRevBack> File_C
hg commit -m "put C back"
Run Code Online (Sandbox Code Playgroud)

但更新不采用过滤器AFAIK所以它也将恢复File_AFile_B.我可以复制File_C到某个地方,hg update然后将其复制回来,但这看起来很蹩脚.有没有办法在Mercurial中直接执行此操作?

Den*_*Den 31

如果你使用你想用具体的命令会工作hg revert,而不是hg update

hg revert -r .^ File_C
hg commit -m "put C back"
Run Code Online (Sandbox Code Playgroud)

  • 如果你想恢复你上次提交(最常见的情况),你可以这样做,所以你不需要查找转数:`hg revert -r.^ File_C` (8认同)
  • 例如,`$ hg revert -r 7428de Libraries/*`. (3认同)

Obe*_*nne 8

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

hg diff -c REVISION --reverse File_C | hg import -m "Revert changes to File_C" -
Run Code Online (Sandbox Code Playgroud)

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

更新:您还可以使用backout命令:

hg backout -I File_C REVISION
hg commit -m "Revert changes of File_C in REVISION" File_C
Run Code Online (Sandbox Code Playgroud)

backout命令会更改您的工作副本,因为它会撤消对File_Crev中提交的更改.REVISION.然后显式提交恢复.