2010-12-14 56 views
13

当我在提交之前检查我的工作副本(使用hg statushg diff)时,我经常会注意到一些不需要的更改。例如,我可能只是在调试会话期间临时添加或删除一些代码。我可以使用mercurial恢复文件中的一系列行吗?

我知道我可以使用hg revert删除不需要的更改,但是这将删除整个文件中的所有更改。有没有办法恢复文件的一部分?

+0

类似:http://stackoverflow.com/questions/876763/mercurial-revert-a -single-hunk – keturn 2011-01-20 19:47:17

回答

5

一种方法是使用像kdiff3这样的图形化比较工具。如果你给它的差异,并选择“合并当前文件”,你可以一行一行地选择你想要的。

更好的方法是更频繁地提交。如果您在添加调试代码之前习惯于提交,那么在添加“真实”代码之前提交或恢复您的调试代码,可以非常容易地删除调试代码,因为它有自己的修订版本。或者,您可以将您的调试代码放在一个单独的分支中。

+0

+1我已经按照[这些说明](http://mercurial.selenic.com/wiki/KDiff3)启用'hg kdiff3'命令,并且我找到了“Merge - Merge this文件“菜单项。我花了一段时间才发现,你需要右键点击冲突来选择你想要选择的两个版本中的哪一个,但它似乎工作。我会试试这个。 – 2010-12-14 17:12:04

+0

“合并当前文件”是拼图的缺失部分。万分感谢。 – 2016-03-20 11:04:22

7

我不知道,如果你能明确地还原个别行,但我在你们这样的情况做的是提交代码,然后恢复休息(在代码)。这个工作流程很容易使用Mercurial的recordcrecord扩展名(我推荐后者)。

+1

我使用:'hg record -m temp; hg revert -a; hg purge; hg strip -k。“来做到这一点,但也可以在消除不需要的更改后将临时提交的更改返回到工作副本。 – 2014-12-10 20:49:58

3

TortoiseHg GUI的“Commit”窗口有一个“Hunk Selection”选项卡,允许选择要提交的文件更改的特定部分。

+1

..但它没有基于Hunk的恢复.. – user2864740 2015-11-27 05:54:46

+0

@ user2864740,恢复文件并提交您想保留的区块。 – 2015-11-27 14:39:26

1

我已经为您的问题得到了不同的答案,这是我的问题。这对于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

4

假设你已经启用了recordshelve扩展,你可以做如下:

hg record -m "garbage" # pick out and commit the change you want to revert 
hg shelve --all   # temporarily hide other changes 
hg strip tip    # remove the garbage changeset 
hg unshelve    # restore the changes you want to keep 
1

我已经与交互ncurses的风格UI hg revert -i,让你走动,并选择部分这样做您可以根据自己的喜好摧毁文件,比较块或逐行文件,具体取决于您展开更改的深度。

我不知道如果这是一个标准的hg功能或没有,你可以验证轻松不够的,如果你有它:

> hg revert --help --verbose | grep -- -interactive 
-i --interactive   interactively select the changes (EXPERIMENTAL) 

只要记住,你标记的变化(X)会是怎样被核爆,而不是你保留的。

0

如果您想要更改的提交是例如ba1c841aaff4, 最简单的就是使用:

hg meld -r ba1c841aaff4^ <filename> 

现在点击中间的右箭头(指向右侧),以恢复你的线条,保存文件并关闭MELD。 kdiff3(旧的和不直观的)可以替代。

边注:为了使用融合在一起,你需要配置它在我们的〜/ .hgrc文件:

[extdiff] 
cmd.meld = 

[merge-tools] 
meld.args=$base $local $other 
相关问题