是否有相当于 `git stash save -p` 的 hg 可以将块拆分成更小的块?

Is there an hg equivalent of `git stash save -p` that can split chunks into smaller chunks?

我只想提交我对文件所做的一些修改,我首选的方法是 shelve/stash 删除我不想提交的更改。这允许我在实际提交之前测试我将提交的更改。

我遇到的问题是,当我在 tortoisehg 中使用 "shelve" 工具时,我找不到任何方法将一个块分成两个较小的块。例如,我有一个看起来像这样的块:

@@ -1,1 +1,2 @@
-hallo world
+hello world
+something else

我想搁置 "something else",这样我就可以提交 "hallo->hello" 修复。然而,由于 tortoisehg 看到的是一个单独的块,我可以搁置两个或 none 的更改。

我也尝试通过命令行使用搁置扩展,但据我从文档中了解到,它不提供仅搁置部分文件的功能。

我不知道执行此操作的命令,但如果您使用的是 tortoiseHg,则可以通过在提交预览区域中选择修改的部分(复选框)来执行此操作。

Mercurial cherry picking changes for commit

您可以从命令行完成您的目标。有 hg commithg reverthg shelve 的交互式版本,并且它们具有低级选项,可以根据需要一起破解补丁;您可以将它们与 -i(或 --interactive)命令行选项一起使用。

这意味着您可以使用 hg commit -ihg commit --amend -i 建立提交。如果安装了 evolve 扩展,则可以使用 hg uncommit 再次从提交中提取更改;如果没有,您可以使用 hg revert -r .~1hg revert -i -r .~1 一个文件,然后再次使用 hg commit --amend -i 来修复它。

为了 select 补丁中的个别行,您有两种选择。您可以使用 e 来编辑补丁(但请参阅下文以获得更方便的选项)。

然后您可以使用 hg shelve 搁置剩余的更改。


原则上您也可以使用 hg shelve -i 执行此操作,但是,有一个很大的警告;如果你为 hg shelve -i 编辑补丁,那么 Mercurial 的合并机制将变得混乱并且不会干净地处理更改,而是将你转储到合并工具中以解决这个明显的冲突(这意味着要解决它需要很多额外的工作) .因此,如果你想在行级操作东西,我强烈建议使用 hg commit -ihg commit --amend -i(如果你不编辑补丁,hg shelve -i 工作正常)。


为了更加方便(防止您编辑补丁),您还可以通过将以下内容添加到您的 hgrc 文件来启用实验性 crecord 选项:

[experimental]
crecord = true

这将为 hg commit -ihg revert -ihg shelve -i 启用基于终端的大块编辑器,允许您 select 单独的行和大块(在内部,工作方式与编辑补丁大致相同)。使用 ? 键在该编辑器中获得帮助;使用 f 到 unfold/fold 个帅哥,使用 space 键到 select hunks/lines.

请注意,此工具的基于行的 selection 与 hg shelve -i 结合使用与编辑补丁相同的注意事项;即如果你想做基于行的 selection,请使用 hg commit -ihg commit --amend -i。此外,hg revert -i 的基于行的 selection 仍将恢复整个大块。 (此选项仍被标记为实验性是有原因的。)