我可以使用mercurial恢复文件中的一系列行吗?

时间:2010-12-14 16:25:57

标签: mercurial

在提交之前检查我的工作副本(使用hg statushg diff)时,我经常会注意到一些不必要的更改。例如,我可能在调试会话期间暂时添加或删除了一些代码。

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

8 个答案:

答案 0 :(得分:7)

我不确定你是否可以明确地恢复单独的行,但我在像你这样的情况下做的是提交代码并恢复其余部分(代码)。使用Mercurial的recordcrecord扩展程序(我推荐后者),此工作流程很简单。

答案 1 :(得分:5)

假设您启用了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

答案 2 :(得分:4)

一种方法是使用像kdiff3这样的图形差异工具。如果您将差异输入并选择“合并当前文件”,您可以逐行选择并选择所需内容。

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

我一直在使用交互式ncurses样式ui hg revert -i,让你随意走动并选择要销毁的部分,文件,差异块或逐行,视情况而定,具体取决于你展开改变的深度。

我不确定这是否是标准hg功能,如果你的功能足够,你可以轻松验证:

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

请记住,您标记的更改(X)将会受到影响,而不是您保留的内容。

答案 5 :(得分: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

需要一点时间习惯 - 你最终不得不重新安排你的补丁,然后折叠你在原始工作补丁中做的任何修复。

另外,查看Bill Barry的阁楼延伸。这个页面讨论了如何将它用于几个不同的工作流程以及如何与使用mq进行比较。 https://www.mercurial-scm.org/wiki/AtticExtension

答案 6 :(得分:0)

如果要进行更改的提交是例如ba1c841aaff4, 最简单的方法是使用:

hg meld -r ba1c841aaff4^ <filename>

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

附注:为了使用meld,你需要在我们的〜/ .hgrc文件中配置它:

[extdiff]
cmd.meld =

[merge-tools]
meld.args=$base $local $other

答案 7 :(得分:0)

下载并安装融合https://meldmerge.org/ (您应该在本地或TortoiseHg上安装Mercurial)

  1. 启动“合并”并选择“版本控制视图”,然后选择您,系统将要求您选择要修改的文件的父目录。 enter image description here
  2. 选择具有未提交更改的文件 enter image description here
  3. 通过选择箭头来选择要将哪些行还原为上一次提交。左边的文档来自上一次提交,右边的文档是具有未提交更改的文件。 enter image description here