我能用Mercurial还原文件中的一段代码吗?

21

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

我知道可以使用 hg revert 来删除不想要的更改,但这会删除整个文件中所有更改。是否有一种方法可以撤销文件中的一部分更改?


类似:https://dev59.com/QXNA5IYBdhLWcg3wpvtg - keturn
8个回答

8

我不确定您是否可以明确地还原单个行,但在像您这样的情况下,我会提交好的代码并还原其余部分(坏的代码)。使用Mercurial的记录crecord扩展可以轻松实现此工作流程(我推荐后者)。


1
我使用以下命令:hg record -m temp ; hg revert -a ; hg purge ; hg strip -k . 来实现这个目的,但同时也会在消除不需要的更改后将暂时提交的更改返回到工作副本中。 - Robert Tupelo-Schneck

8

我一直使用交互式的ncurses样式ui hg revert -i 来进行此操作,它允许你四处走动并选择你想要删除的部分,无论是文件、diff块还是逐行,取决于你展开更改的深度。

我不确定这是否是标准的hg功能,你可以轻松地验证一下你的版本是否有此功能:

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

请记住,您标记的更改 (X) 将被删除,而不是保留下来。


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

5

一种方法是使用图形化的比较工具,例如 kdiff3。如果你将差异文件输入该工具并选择“合并当前文件”,那么你可以逐行选择需要保留的内容。

更好的方式是更频繁地提交代码。如果你养成在添加调试代码之前提交代码的习惯,然后在添加"真正"代码之前要么提交或还原调试代码,这样就很容易删除调试代码,因为它有自己的版本。或者,你可以将调试代码放在一个单独的分支中。


+1 我按照这些说明启用了 hg kdiff3 命令,并找到了“合并 - 合并此文件”菜单项。我花了一些时间才发现需要右键单击冲突以选择要选择的两个版本中的哪一个,但它似乎有效。我会试一试。 - Wim Coenen
“Merge Current File”是这个难题中缺失的部分。非常感谢。 - Mark Ch

3

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


@user2864740,请还原文件并提交您想要保留的块。 - Mark Tolonen

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


0

下载并安装meld https://meldmerge.org/(你应该本地安装了Mercurial或TortoiseHg)

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

0
如果您想修改的提交是 ba1c841aaff4,最简单的方法是使用:
hg meld -r ba1c841aaff4^ <filename>

现在点击中间的右箭头(指向右侧)以还原您的行,保存文件并关闭meld。 kdiff3(旧版和不直观)可以是一种替代方法。

附注:为了使用meld,您需要在我们的~/.hgrc文件中进行配置:

[extdiff]
cmd.meld =

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接