Mercurial:如何修改最后一次提交?

我正在寻找Mercurial中的git commit --amend的一部分,即修改我的工作副本链接到的提交的方法。 这个修改程序的要求是:

  • 如果可能的话,它不应该要求任何扩展。 它不能要求非默认的扩展名 ,也就是不能与官方的Mercurial安装一起使用的扩展名。

  • 如果提交修改是我目前分支的一个负责人,那么应该创build新的负责人 。 如果提交不是头,可能会创build一个新头。

  • 程序应该是安全的,如果出于某种原因修改失败,我希望恢复与修改之前相同的工作副本和存储库状态。 换句话说,如果修改本身可能失败,则应该有一个故障安全过程来恢复工作副本和存储库状态。 我指的是在修改过程(比如冲突)的性质中存在的“失败”,而不是文件系统相关的问题(比如访问限制,不能locking文件以便写入… )

更新(1):

  • 该过程必须是可自动化的 ,因此可以由GUI客户端执行,而无需任何用户交互。

更新(2):

  • 不得触摸工作目录中的文件(某些修改的文件可能存在文件系统locking)。 这尤其意味着,一个可能的方法可能在任何时候都不需要一个干净的工作目录。

随着Mercurial 2.2的发布,你可以使用--amend选项和hg commit来更新当前工作目录的最后一个提交

从命令行参考 :

可以使用–amend标志来修改工作目录的父目录,除了那些当前由hg状态报告的,还包含父目录中的更改的新提交。 旧的提交存储在.hg / strip-backup的备份包中(请参阅hg help bundle和hg help unbundle关于如何恢复它)。

消息,用户和date取自修改的提交,除非另有规定。 当在命令行上没有指定消息时,编辑器将打开修改提交的消息。

重要的是,这个机制是“安全的”,因为它依赖于相对较新的“阶段”function来防止更新,这些更新会改变已经在本地存储库之外提供的历史logging。

您有3个选项可以在Mercurial中编辑提交:

  1. hg strip --keep --rev -1撤销最后的(1)提交,所以你可以再次执行(查看这个答案以获取更多信息)。

  2. 使用Mercurial附带的MQ扩展

  3. 即使Mercurial不附带, Histedit扩展也值得一提

您还可以在Mercurial wiki的编辑历史页面上查看。

总之,编辑历史真的很难,也很沮丧 。 如果您已经推动了您的更改,那么除非您完全控制了所有其他克隆,否则几乎没有什么可以做的。

我不是很熟悉git commit --amend命令,但是AFAIK,Histedit似乎是最接近的方法,但可惜的是它没有与Mercurial一起发货。 MQ的使用真的很复杂,但是你可以做任何事情。

相当于hg commit --amend GUI hg commit --amend

这也从TortoiseHG的GUI(我使用v2.5):

切换到“提交”视图,或者在工作台视图中select“工作目录”条目。 “提交”button有一个名为“修改当前修订”的选项(单击button的下拉箭头来查找它)。

在这里输入图像说明

  || || \/ 

在这里输入图像说明

警告

这个额外的选项只有在mercurial版本至less为2.2.0的情况下才可以使用,如果当前的版本不公开,不是补丁,也没有孩子。 […]

点击button将会调用'commit –amend'来修改版本。

有关THG开发通道的更多信息

假设你还没有传播你的修改,这里是你可以做的。

  • 添加到您的.hgrc:

     [extensions] mq = 
  • 在您的存储库中:

     hg qimport -r0:tip hg qpop -a 

    当然,你不需要从修订版本0开始,或者popup所有的补丁,因为最后一个popup( hg qpop )就足够了(见下文)。

  • 删除.hg/patches/series文件中的最后一个条目,或者您不喜欢的修补程序。 重新sorting也是可能的。

  • hg qpush -a; hg qfinish -a
  • 删除.diff文件(未应用的补丁)仍然在.hg /补丁(应该是你的情况之一)。

如果你不想 收回所有的补丁,你可以使用hg qimport -r0:tip (或类似的)编辑它,然后编辑东西并使用hg qrefresh将这些变化合并到堆栈中最上面的补丁。 阅读hg help qrefresh

通过编辑.hg/patches/series ,你甚至可以删除几个补丁,或者重新排列一些补丁。 如果你最近的版本是99,你可以使用hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a

当然,这个程序是非常不鼓励和风险的 。 在做这件事之前做一切备份

作为一个旁注,我已经在私人存储库上做了无数次。

我正在调整krtek写的东西。 更具体地解决scheme1:

假设:

  • 你已经提交了一个(!)变更集,但尚未推送
  • 你想修改这个变更集(例如添加,删除或更改文件和/或提交信息)

解:

  • 使用hg rollback撤消上次提交
  • 再次承诺新的变化

回滚真的撤消了最后一个操作。 它的工作方式很简单:HG的正常操作只能追加到文件中; 这包括一个提交。 Mercurial会跟踪最后一个事务的文件长度,因此可以通过将文件截断回到原来的长度来完全撤销一个步骤。

Interesting Posts