如何在Mercurial中删除提交?

57

我想彻底删除一个Mercurial提交,就像它从未进入过代码仓库一样,并回滚到之前的提交。

这是否可能?


重复的内容:https://dev59.com/d3E95IYBdhLWcg3wXsyR - 特别是参考答案 https://dev59.com/d3E95IYBdhLWcg3wXsyR#6549478 - Rory
可能是Mercurial中是否有删除本地提交的方法?的重复问题。 - StayOnTarget
9个回答

33
如果这是你最后一次提交且还未推送到任何地方,你可以使用“回滚(rollback)”来撤销操作。否则无法撤销,建议更改密码。
编辑:有人指出你可以从旧版本克隆并合并你想要保留的更改。但如果你已经将其推送到你无法控制的仓库中,那么一旦推送,你的数据很可能非常难以找回。

1
哈哈,我不小心干了那件事(我的SSH私钥就没了)。 - Adam Gent
如果您还没有推送修订版本,将阶段更改为秘密怎么样? - 1nfiniti
@mikeyUX:这个答案是在2.1发布之前写的,但将阶段更改为secret实际上并不会删除更改集;它只是防止您在hg outgoing中看到它或与另一个存储库共享它。将阶段更改为secret,然后克隆将做大致与我的编辑建议相同的事情。但在那之前,我会使用histedit或mq。 - nmichaels
使用HisteditExtension,您可以删除提交。该功能可能比此已接受的答案更新。 - Jon Davis
@stimpy77:如果你已经推送或者有人已经拉取了代码,Histedit仍然无法帮助你。如果这两种情况都没有发生,那么你是正确的。Histedit、mq、rollback和strip如果被恰当地使用,都可以消除改动。 - nmichaels

30

您可以尝试删除有关提交的mq信息。

  • 为此,您需要转到“文件”->“设置”->“扩展”。
  • 在那里检查mq并重新启动gui。
  • 之后,只需右键单击不需要的提交,并选择“ModifyHistory->Strip”

1
你是在说TortoiseHg吗? - Pluto

13

如果要编辑历史记录,我会使用Histedit Extension扩展程序。

 hg histedit 45:c3a3a271d11c

然而请记住,这只在你还没有将提交推送到公共代码库、你拥有公共代码库和/或你能够说明所有克隆版本的情况下才有意义。如果你收到以下错误信息:

abort: can't rebase immutable changeset 43ab8134e7af

这意味着Mecurial认为这是一个公共变更集(请参见phases),已经被推送 - 您可以通过以下方式强制将其重新变为draft

hg phase -f -d 45:c3a3a271d11c

1
我相信这是更正确、更实时的答案。Hg在不断发展。 - Jon Davis

7
我经常遇到这种情况。我提交了一个更改,然后拉取并推送。但是随后出现了一些不必要的更改。普通的hg rollback不足以解决问题,因为它只能撤销拉取操作...
以下是正确的做法:
hg strip <rev>

如果你没有将你的更改集推送到任何地方,那么一切都是轻松无痛的。


在 hg 版本 6.3.2 中,我必须使用 'hg debugstrip -r <rev>'。 - Thorsten Hüglin

6
如果提交了不止一个版本和/或您已经将其推送到其他地方,您可以克隆存储库并指定应该克隆的最后更改集。
请看我的答案,了解如何执行此操作:
Mercurial: Fix a borked history 如果只在本地提交而没有推送,则可以在本地创建一个克隆副本(如我的链接中所述),这样就完成了。
如果您已经将代码推送到某个远程仓库,则需要用克隆副本替换它。
当然,这取决于您是否能够(或被允许)这样做。

5

我意识到我的建议并没有删除提交,但该链接确实讨论了所有选项,包括nmichaels建议的“hg rollback”选项。 - Jeremy Whitlock
一般来说,我喜欢这个解决方案。承认自己的错误并保留糟糕提交的历史记录以及你撤回它们的事实是可以接受的。 - Kamil Kisiel

3
如果使用乌龟软件,您可以使用修改历史记录 > 剥离...

1

在2022年,我使用了evolve扩展程序。它是实现此目的的最佳扩展程序之一。

要删除不需要的变更集(例如,如果您快速进行了代码调整以使其正常工作),请使用prune命令:

$ echo 'debug hack' >> file1.c
$ hg commit -m 'debug hack'

现在你有了一个适当的补丁,您可以执行hg prune .命令:
$ hg prune .
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
working directory is now at 2a39221aaebb
1 changesets pruned

如果您将更改推送到远程仓库,您只会发现过时标记:
$ hg push
searching for changes                          
no changes found                               
remote: 1 new obsolescence markers             

要检查本地仓库的更改,您可以从远程仓库进行 pull 操作:

$ hg pull                            
pulling from ssh://userid@server/repo
searching for changes      
no changes found

1

是的。除非我弄错了,从v2.3(rel. 2012/08/01)开始,您可以使用HisteditExtension,使用drop命令删除提交,以及stripbackout来删除更改。

有关该功能的简单Google搜索:https://www.google.com/webhp#q=histedit+drop


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