当我在提交前查看我的工作副本(使用 hg status
和 hg diff
)时,经常会注意到一些不必要的更改。例如,在调试会话期间,我可能会暂时添加或删除一些代码。
我知道可以使用 hg revert
来删除不想要的更改,但这会删除整个文件中所有更改。是否有一种方法可以撤销文件中的一部分更改?
当我在提交前查看我的工作副本(使用 hg status
和 hg diff
)时,经常会注意到一些不必要的更改。例如,在调试会话期间,我可能会暂时添加或删除一些代码。
我知道可以使用 hg revert
来删除不想要的更改,但这会删除整个文件中所有更改。是否有一种方法可以撤销文件中的一部分更改?
我一直使用交互式的ncurses样式ui hg revert -i
来进行此操作,它允许你四处走动并选择你想要删除的部分,无论是文件、diff块还是逐行,取决于你展开更改的深度。
我不确定这是否是标准的hg
功能,你可以轻松地验证一下你的版本是否有此功能:
> hg revert --help --verbose | grep -- -interactive
-i --interactive interactively select the changes (EXPERIMENTAL)
请记住,您标记的更改 (X
) 将被删除,而不是保留下来。
一种方法是使用图形化的比较工具,例如 kdiff3
。如果你将差异文件输入该工具并选择“合并当前文件”,那么你可以逐行选择需要保留的内容。
更好的方式是更频繁地提交代码。如果你养成在添加调试代码之前提交代码的习惯,然后在添加"真正"代码之前要么提交或还原调试代码,这样就很容易删除调试代码,因为它有自己的版本。或者,你可以将调试代码放在一个单独的分支中。
hg kdiff3
命令,并找到了“合并 - 合并此文件”菜单项。我花了一些时间才发现需要右键单击冲突以选择要选择的两个版本中的哪一个,但它似乎有效。我会试一试。 - Wim CoenenTortoiseHg GUI的“提交”窗口有一个“变更块选择”选项卡,允许选择要提交的文件更改的特定部分。
我对你的问题有一个不同的答案,这也是我所面临的相同问题。这是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
hg meld -r ba1c841aaff4^ <filename>
现在点击中间的右箭头(指向右侧)以还原您的行,保存文件并关闭meld。 kdiff3(旧版和不直观)可以是一种替代方法。
附注:为了使用meld,您需要在我们的~/.hgrc文件中进行配置:
[extdiff]
cmd.meld =
[merge-tools]
meld.args=$base $local $other