我可以压缩提交Mercurial吗?

我有一对提交应该只是一个。 如果我使用git,我会使用:

git rebase -i <some-commit-before> 

然后挤压它们。

我能做到这一点在mercurial? 如果是这样,怎么样?

是的,您可以使用mercurial来执行此操作,而无需通过连接更改集进行任何扩展。

或者,如果你想使用扩展,你可以使用:

  • 崩溃扩展
  • Rebase扩展或
  • Histedit扩展

我最喜欢的是hg strip --keep命令。 然后我在一个提交中提交所有更改。

这对我来说是最快最舒服的方式,因为在日常工作中我喜欢做很多小的提交;)


注1: strip需要一个内置的扩展mq来启用。
注2:默认情况下,我最喜欢的Git / Mercurial客户端(SmartGit / Hg)追加 – 在strip过程中--keep参数。 更方便的是:它提供了一个叫做join commits选项:]

Rebase扩展工作就像一个魅力。 压缩2个提交:

 $ hg rebase --dest .~2 --base . --collapse 

点是当前修订的快捷方式。

当你在一个分支上进行一些提交并且想把它们全部合并成一个时,它会更容易:

 $ hg rebase --dest {destination branch (eg master)} --base . --collapse 

这是如何工作的:

在这里输入图像说明

(来自http://mercurial-scm.org/wiki/RebaseExtension#Collapsing

如果你正在阅读这个答案,你可以忘记在这个答案中提到的所有其他选项,并使用evolve扩展中的fold命令。

evolve是mercurial的延伸,这有助于我们有安全的可变历史,但它仍然是实验性的。 你可以使用它从它的repo克隆它,并像这样添加到你的.hgrc中。

 [extensions] evolve = ~/evolve/hgext/evolve.py 

假设你在主目录中克隆了进化回购。 现在你很好走。 你也可以通过hg help fold寻找hg help fold

折叠命令

你告诉fold来压扁/折叠一个没有被破坏的线性提交链。 什么是折叠,它会创build一个新的变更集,其中包含所有变更集的变更,并将所有这些提交内容标记为过时。 您可以在文档中对此有更深入的了解。

现在假设你有以下的历史。

 a -> b -> c -> d -> e -> f -> g 

你想挤压efg 。 你可以做

 hg up g hg fold -re 

结果将是

 a -> b -> c -> d -> h 

其中h是包含所有三个提交efg的变更的变更集。

您也可以从历史中间折叠变更集,即不一定必须select包含提示的链。 假设你想折叠bcd 。 你可以做

 hg up d hg fold -rb hg evolve --all 

这将导致

 a -> i -> j 

其中ibcdj的折叠变化集,与h相同。 进化的用户指南是必读的。