所以我总是在Mercurial中犯愚蠢的错误。通常情况下,我不会执行“hg拉取”和“hg更新”就开始工作。当我试图推动我的更改时,我得到一个错误。

有没有办法删除我的本地提交,这样我就可以避免创建多个头、分支等?我只想删除我的本地提交,将我的更改与提示合并,然后重新提交。听起来很简单,对吧?我似乎找不到任何方法来轻松地删除本地提交,这样我就可以干净地与技巧合并。

同样,我只是试图删除本地提交与“hg ci”。我不想修改文件,还原文件等等。


当前回答

除了Samaursa的优秀答案,你可以使用进化扩展的修剪作为一个安全和可恢复的版本的strip,将允许你回去万一你做错了什么。

我在我的。hgrc上有这些别名:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

请注意,prune也有—keep,就像strip一样,保持工作目录完整,允许您重新提交文件。

其他回答

你可以使用Rebase扩展更容易地解决这个问题,只需要使用hg pull—Rebase,你的提交就会自动重新提交到被拉的修订中,避免了分支问题。

正如其他人指出的那样,你可能只需要拉出并合并头部,但如果你真的想摆脱你的提交而不使用任何EditingHistory工具,那么你可以通过克隆-r你的回购来获得所有的更改。

这不会从原始存储库中删除它们,但会创建一个不包含它们的新克隆。然后你可以删除你修改的回购(如果你愿意的话)。

[Hg龟4.6.1] 如果是最近的操作,可以使用“回滚/撤销”操作(Ctrl+U)。

我也遇到过这个问题。我做了2次提交,想要回滚和删除两次提交。

$ hg rollback

但是hg回滚只是回滚到最后一次提交,而不是两次提交。当时我没有意识到这一点,我修改了代码。

当我发现hg回滚只回滚了一次提交时,我发现我可以使用hg strip #changeset#。因此,我使用hg log - l10来查找最近的10次提交,并获得我想要去除的正确更改集。

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

abort:发现的局部变化意味着什么?这意味着hg发现了尚未提交的代码更改。所以,要解决这个问题,你应该hg diff保存你所更改的代码,hg恢复和hg strip #changeset#。就像这样:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

完成上述操作后,可以对diff文件打补丁,然后将代码添加回项目。

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

如果你熟悉git,你会很乐意使用histedit,就像git rebase -i一样。