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中编辑提交:
-
hg strip --keep --rev -1
撤销最后的(1)提交,所以你可以再次执行(查看这个答案以获取更多信息)。 -
使用Mercurial附带的MQ扩展
-
即使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会跟踪最后一个事务的文件长度,因此可以通过将文件截断回到原来的长度来完全撤销一个步骤。