当我在提交之前检查我的工作副本(使用hg status
和hg diff
)时,我经常会注意到一些不需要的更改。例如,我可能只是在调试会话期间临时添加或删除一些代码。我可以使用mercurial恢复文件中的一系列行吗?
我知道我可以使用hg revert
删除不需要的更改,但是这将删除整个文件中的所有更改。有没有办法恢复文件的一部分?
当我在提交之前检查我的工作副本(使用hg status
和hg diff
)时,我经常会注意到一些不需要的更改。例如,我可能只是在调试会话期间临时添加或删除一些代码。我可以使用mercurial恢复文件中的一系列行吗?
我知道我可以使用hg revert
删除不需要的更改,但是这将删除整个文件中的所有更改。有没有办法恢复文件的一部分?
一种方法是使用像kdiff3
这样的图形化比较工具。如果你给它的差异,并选择“合并当前文件”,你可以一行一行地选择你想要的。
更好的方法是更频繁地提交。如果您在添加调试代码之前习惯于提交,那么在添加“真实”代码之前提交或恢复您的调试代码,可以非常容易地删除调试代码,因为它有自己的修订版本。或者,您可以将您的调试代码放在一个单独的分支中。
+1我已经按照[这些说明](http://mercurial.selenic.com/wiki/KDiff3)启用'hg kdiff3'命令,并且我找到了“Merge - Merge this文件“菜单项。我花了一段时间才发现,你需要右键点击冲突来选择你想要选择的两个版本中的哪一个,但它似乎工作。我会试试这个。 – 2010-12-14 17:12:04
“合并当前文件”是拼图的缺失部分。万分感谢。 – 2016-03-20 11:04:22
TortoiseHg GUI的“Commit”窗口有一个“Hunk Selection”选项卡,允许选择要提交的文件更改的特定部分。
..但它没有基于Hunk的恢复.. – user2864740 2015-11-27 05:54:46
@ user2864740,恢复文件并提交您想保留的区块。 – 2015-11-27 14:39:26
我已经为您的问题得到了不同的答案,这是我的问题。这对于mercurial queues是一个很好的使用案例!
当我即将开始增加调试代码的变化,我认为是准备好了,我做了以下内容:
hg qnew -m "fix for bug #123" fix.patch # basically a local-only commit
hg qnew -m "debugging" dbg.patch # prepare the next changeset at the tip
[add my debugging]
hg qrefresh # update the changeset at the tip
[...]
hg qpop # pop the debugging off the repo history
这需要一点点的习惯 - 你最终不得不重新排序您的修补程序,然后折叠您在原始工作修补程序中所做的任何修复。
此外,检查比尔巴里的阁楼扩展。本页面讨论如何将其用于几个不同的工作流程,以及与使用mq相比的方式。 https://www.mercurial-scm.org/wiki/AtticExtension
我已经与交互ncurses的风格UI hg revert -i
,让你走动,并选择部分这样做您可以根据自己的喜好摧毁文件,比较块或逐行文件,具体取决于您展开更改的深度。
我不知道如果这是一个标准的hg
功能或没有,你可以验证轻松不够的,如果你有它:
> hg revert --help --verbose | grep -- -interactive
-i --interactive interactively select the changes (EXPERIMENTAL)
只要记住,你标记的变化(X
)会是怎样被核爆,而不是你保留的。
如果您想要更改的提交是例如ba1c841aaff4, 最简单的就是使用:
hg meld -r ba1c841aaff4^ <filename>
现在点击中间的右箭头(指向右侧),以恢复你的线条,保存文件并关闭MELD。 kdiff3(旧的和不直观的)可以替代。
边注:为了使用融合在一起,你需要配置它在我们的〜/ .hgrc文件:
[extdiff]
cmd.meld =
[merge-tools]
meld.args=$base $local $other
类似:http://stackoverflow.com/questions/876763/mercurial-revert-a -single-hunk – keturn 2011-01-20 19:47:17