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

mst*_*rap 209 mercurial commit git-amend mercurial-commit

我正在寻找git commit --amendMercurial 的反向部分,即修改我的工作副本链接的提交的方法.该修订程序的要求是:

  • 如果可能,它不应该要求任何扩展.它不能要求非默认扩展,即没有官方Mercurial安装附带的扩展.

  • 如果修改提交是我当前分支的一个负责人,则不应创建新的头.如果提交不是头,则可以创建新头.

  • 该程序应该是安全的,如果由于任何原因修改失败,我希望在修改之前恢复相同的工作副本和存储库状态.换句话说,如果修改本身可能失败,则应该有一个故障安全过程来恢复工作副本和存储库状态.我指的是修改程序性质的"失败"(例如冲突),而不是与文件系统相关的问题(如访问限制,无法锁定文件进行写入,......) )

更新(1):

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

更新(2):

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

Chr*_*ips 286

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

命令行参考:

--amend标志可用于修改工作目录的父级,其中包含父级中的更改以及当前由hg status报告的更改(如果有).旧提交存储在.hg/strip-backup的备份包中(请参阅hg help bundle和hg help unbundle有关如何恢复它).

除非指定,否则消息,用户和日期取自修订的提交.如果未在命令行中指定消息,编辑器将打开修改后的提交消息.

最棒的是,这种机制是"安全的",因为它依赖于相对较新的"阶段"功能来阻止更新,这些更新将改变已经在本地存储库之外提供的历史记录.

  • 要在最后一次提交时更新消息:hg commit --amend -m"这是我的新消息" (5认同)
  • 好答案!实验性的[evolve扩展名](http://mercurial.selenic.com/wiki/EvolveExtension)可让您安全地修改** non-head **提交。旧的提交将被标记为过时和隐藏。使用非发布服务器,您甚至可以在推送变更集之后安全地执行此操作。 (2认同)

krt*_*tek 51

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

  1. hg strip --keep --rev -1撤消last(1)commit(s),这样你就可以再次执行(有关更多信息,请参阅此答案).

  2. 使用Mercurial附带的MQ扩展

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

您还可以查看Mercurial wiki 的" 编辑历史记录"页面.

简而言之,编辑历史真的很难并且气馁.如果你已经推动了你的改变,除了你完全掌控所有其他克隆外,你几乎无能为力.

我并不是很熟悉这个git commit --amend命令,但是AFAIK,Histedit似乎是最接近的方法,但遗憾的是它并没有随Mercurial一起提供.MQ使用起来非常复杂,但你几乎可以用它做任何事情.

  • 我同意应该避免编辑已发布更改的历史记录,但编辑我的*本地*历史记录是DVCS的亮点之一.带有qimport的MQ是纯粹的历史编辑,AFAICT. (3认同)

Cri*_*scu 38

GUI等效于hg commit --amend:

这也适用于TortoiseHG的GUI(我使用的是v2.5):

切换到"提交"视图,或在工作台视图中选择"工作目录"条目."提交"按钮有一个名为"修改当前版本"的选项(单击按钮的下拉箭头即可找到它).

在此输入图像描述

          ||
          ||
          \/
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

警告:

只有当mercurial版本至少为2.2.0时才会启用此额外选项,如果当前版本不是公共版本,则不是补丁且没有子级.[...]

单击该按钮将调用'commit --amend'来"修改"修订版.

有关THG dev频道的更多信息


Luc*_*ero 7

我正在调整krtek所写的内容.更具体地解决方案1:

假设:

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

解:

  • 用于hg rollback撤消上次提交
  • 再次提交新的更改

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

  • 有一点要强调回滚,因为它会抓住人们,它是回滚上的最后一个*事务*被回滚,而不是最后一次提交.因此,如果其他东西导致了对repo的写入,则回滚将无济于事.这是一个微妙但重要的事情要记住.一旦回滚窗口关闭,MQ和histedit可以提供帮助,但仍然只能达到某一点. (8认同)

hoc*_*chl 7

假设您还没有传播您的更改,那么您可以执行此操作.

  • 添加到.hgrc:

    [extensions]
    mq =
    
    Run Code Online (Sandbox Code Playgroud)
  • 在您的存储库中:

    hg qimport -r0:tip
    hg qpop -a
    
    Run Code Online (Sandbox Code Playgroud)

    当然你不需要从修订版零开始或弹出所有补丁,最后只需要一个pop(hg qpop)就足够了(见下文).

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

  • hg qpush -a; hg qfinish -a
  • 删除.diff仍在.hg/patches 中的文件(未应用的补丁)(在您的情况下应该是一个).

如果你不想收回所有的补丁,您可以通过使用编辑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.

当然,这个程序非常沮丧和冒险.在执行此操作之前,请备份所有内容!

作为旁注,我在私人存储库上完成了数十万次.