Mercurial是否可以更新提交?

3
假设我刚刚在Mercurial中提交了一个文件,并附上了描述,例如“删除了所有不再需要的注释”。几分钟后,我意识到我忘记删除那种注释中的一些。我希望能够更新几分钟前进行的提交,而不是必须重新提交一个新的。是否有可能做到这一点?
4个回答

6
假设您尚未推送并且没有进行任何其他提交,您可以直接使用hg rollback

2
MQ扩展可以帮助您实现这一点。但请注意,从技术上讲,这会创建一个新的变更集并删除现有的变更集,因此如果您已经将以前的变更集推送到“官方”/共享存储库,则无法进行操作。
我通常会像这样按照您所描述的方式进行操作:
$ hg qimport -r tip  
$ hg qrefresh -e # edit commit message  
$ hg qfinish -a

1
你应该添加一个警告,提醒在将此提交推送到其他地方之前需要执行此操作。如果你这样做了,并且编辑了提交,那么你将会遇到一堆麻烦。 - Lasse V. Karlsen
我是唯一一个不“懂”mq扩展的人吗?老实说,我已经尝试过了。有没有什么好的教程,不要超过5页? - Kyle Heironimus
1
@Kyle:MQ 的“问题”在于它改变了一些基本的 hg 概念/实践,尤其是不可变更的 changeset 和 DAG。我花了几天时间才“搞懂”它,但一旦你理解了它就会发现它非常有价值。我认为最好/最快的方法是了解它的工作原理,这实际上非常简单:只是一个可以转换成 changesets 的补丁文件列表。(由于评论长度限制,待续...) - Geoffrey Zheng
@Kyle: (cont.) 阅读关于补丁文件的章节,以及有关系列和状态文件的另一篇文章,并查看qnewqrefreshqpushqpophg help中的相关信息,这样您就可以完成90%的任何5页教程所要教授的事情了。 - Geoffrey Zheng
@Geoffrey - 谢谢。从我读过的文档中,它对现有DAG的影响并不是很明显。意识到这一点后,它就更有意义了。 - Kyle Heironimus
@Kyle:我不会说MQ“搞乱”了历史,只是改变了本应不可变的历史。 MQ的一个重要“规则”是不要推送补丁(hg push在没有-f的情况下会中止)。 要么使用qfinish,要么使用qcommit然后推送补丁变更集。 - Geoffrey Zheng

2
histedit扩展程序可以让你做到这一点。就像MQ一样,如果你已经推送了其他地方,就不应该编辑它,但是如果你没有,你可以运行hg histedit REV,它会列出从那个版本到现在的所有变更集,然后你选择要更改哪些。然后,histedit会将您备份到最早的版本,并在您进行更改后运行hg histedit --continue。洗、涤、重复。”

-1
如果你要分享你的代码库,为了避免给大家带来麻烦,请不要尝试这样做。

那就好。我会使用TortoiseHg中的存储库浏览器。转到相关的修订版本,右键单击并选择“Mercurial Queues>导入修订版本到MQ”。进行更改,在提交对话框中刷新补丁,然后将补丁完成为新提交。我自己没有做过这个,但应该可以工作。您可能需要在更新之前进行导入,或者使用shelve将其暂时移出路径。 - Binary Phile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接