使用Mercurial,如何在推送之前将一系列变更集"压缩"为一个?

Luc*_*cas 95 compression mercurial push changeset

假设我有一个本地和一个远程Mercurial存储库.现在,我开始研究一个功能.我正在努力,当我认为它完成后,我提交变更集.再测试一下,我发现我可以通过调整代码中的内容来进一步改进这个功能.我做出改变并提交.20分钟后,我发现这个新功能有一个错误,所以我修复它并提交它.

我现在有3个变更集,我真的想将其作为一个变更集推送到远程存储库,例如,消息"实现功能X".

如何在没有太多麻烦的情况下做到这一点?我相信我可以用补丁来做,但看起来很多工作.

Ste*_*sek 52

histedit扩展正是你所期待的.

hg histedit -o
Run Code Online (Sandbox Code Playgroud)

要么

hg histedit --outgoing
Run Code Online (Sandbox Code Playgroud)

将显示传出变更集的列表.从列表中你可以

  • 折叠2个或更多变更集,创建一个变更集
  • 删除变更集将其从历史记录中删除
  • 根据需要重新排序变更集.

histedit将提示您输入折叠变更集的新提交消息,默认为两个消息,"\n***\n"将它们分开.

你也可以使用mq扩展获得类似的结果,但它要困难得多.

您也可以使用折叠扩展来进行折叠,但它不提供良好的UI,也不提供编辑生成的提交消息的方法.编辑生成的提交消息还允许清理最终消息,这是我总是最终使用的.


Ste*_*osh 39

如何在折叠扩展

  • 来自未来的问候!我只是用谷歌搜索相同的功能,显然现在hg支持这个开箱即用`hg rebase --collapse`.[查看rebase命令上的hg wiki.](https://www.mercurial-scm.org/wiki/RebaseExtension#Collapsing)由于这个问题是第3个整体搜索结果和第一个在stackoverflow上,我认为这个信息可能很有用. (20认同)
  • 你可以在一个分支中使用`hg rebase`和`--collapse`. (3认同)

Ark*_*ady 21

是的,您可以使用补丁来执行此操作:假设您的工作处于变更集100到110(包括100和110)

  1. 创建补丁:

    % hg export -o mypatch 100:110 --git

  2. 更新到99:

    % hg update 99

  3. 使用--no-commit应用补丁(否则您将获得所有更改集):

    % hg import --no-commit mypatch

  4. 立即提交所有更改:

    % hg commit

  5. 你现在有两个头(110和111),它们在你工作目录中产生的文件应该是等价的 - 也许在剥离旧的文件之前将它们区分开来:

    % hg strip 100

好吧,既然我把它全部拼出来了,它确实看起来很冗长,但是我自己做了很多次,我觉得它不是太多的苦差事......


小智 19

如果您使用TortoiseHg,请使用只需选择两个修订版(使用CTRL选择非后续版本),右键单击并选择"压缩历史记录".

之后,您将从之前选择的第一个更改中获得新头的新更改列表,它将包含您选择的更改列表之间的所有后续更改列表.

如果您不再需要它们,您可以简单地删除旧的更改列表:使用MQ扩展.再次,在TortoiseHg中:右键单击第一个需要用它的所有后代剥离的更改列表,"修改历史 - >剥离".


Chr*_*ips 18

我使用mq进行折叠的首选方法是使用TortoiseHg ,如此处所述.但是,它可以很容易地从命令行完成,如下所示:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository
Run Code Online (Sandbox Code Playgroud)

(可能有更好的方法来执行qfold步骤,但我不知道它,因为我通常使用TortoiseHg进行该操作.)

一开始看起来有点复杂,但是一旦你开始使用mq,它就非常简单和自然 - 而且你可以使用mq做各种其他的东西,非常方便!