有没有办法删除Mercurial中的本地提交?

时间:2010-02-26 01:43:00

标签: mercurial

所以我在Mercurial中犯了一个愚蠢的错误。很多时候,我会在没有做“hg pull”和“hg update”的情况下开始工作。当我试图推动我的更改时,我收到了错误。

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

同样,我只是想删除用“hg ci”制作的本地提交。我不想修改文件,还原等等。

10 个答案:

答案 0 :(得分:230)

启用“ strip ”扩展名并输入以下内容:

hg strip #changeset# --keep

其中#changeset#是要删除的变更集的哈希值。这将删除所谓的变更集包括从中变为的变更集,并将保持您的工作目录不变。如果您还希望还原已提交的代码更改,请删除--keep选项。

有关详细信息,请查看Strip Extension

如果你得到“未知命令'strip'”,你可能需要启用它。为此,请找到.hgrcMercurial.ini文件,并将以下内容添加到其中:

[extensions]
strip =

注意(正如Juozas在他的评论中所提到的)有多个头是Mercurial中的正常工作流程。你不应该使用strip命令来对抗它。相反,您应该将头部与传入头部合并,解决任何冲突,测试,然后推送。

当你真的想要摆脱污染分支的变更集时,strip命令很有用。事实上,如果您处于this question状态并且想要永久删除所有“草稿”更改集,请查看the top answer,这基本上建议:

hg strip 'roots(outgoing())'

答案 1 :(得分:92)

如果你正在使用Hg Tortoise,只需激活扩展名“ strip ”:

  
      
  1. 文件/设置/扩展/
  2.   
  3. 选择 strip
  4.   

然后选择要开始条带化的底部修订版,在其上执行right click,然后选择:

  
      
  1. 修改历史记录
  2.   
  3.   

就像这样:

enter image description here

在这个例子中,它将从第19个修订版删除到最后一个修订版(22)。

答案 2 :(得分:19)

现代答案(仅在Mercurial 2.1之后有关):

使用Phases并将您不想共享的修订标记为机密(私有)。这样,当你推动他们将不会被发送。

在TortoiseHG中,您可以右键单击提交以更改其阶段。

另外:您也可以使用扩展名“rebase”将您的本地提交移动到共享存储库的头部。

答案 3 :(得分:14)

正如其他人都在指出你应该只是拉动然后合并头部,但是如果你真的想要在没有任何EditingHistory工具的情况下摆脱你的提交,那么你可以hg clone -r你的回购除了那些变化之外什么都没有。

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

答案 4 :(得分:9)

您可以使用Rebase extension更轻松地解决这个问题,只需使用hg pull --rebase,您的提交就会自动重新调整到撤消修订版本,从而避免出现分支问题。

答案 5 :(得分:9)

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

$ hg rollback

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

当我发现hg rollback刚刚回滚一次提交时,我发现我可以使用hg strip #changeset#。所以,我使用hg log -l 10来查找最新的10次提交,并获得我想要strip的正确变更集。

$ 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: local changes found是什么意思?这意味着hg发现了尚未提交的代码的更改。因此,要解决此问题,您应hg diff保存已更改的代码hg reverthg strip #changeset#。就像这样:

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

完成上述操作后,您可以patch将diff文件和代码添加回项目中。

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

答案 6 :(得分:5)

如果您熟悉git,您会很高兴使用git rebase -i的{​​{3}}。

答案 7 :(得分:4)

hg strip正是您要找的。如果您熟悉git,它类似于git reset

使用控制台:

  1. 您需要知道修订号。 hg log -l 10。此命令显示最近10次提交。找到您正在寻找的提交。您需要从变更集行changeset: 5888:ba6205914681

  2. 中输入4位数字
  3. 然后hg strip -r 5888 --keep。这将删除提交记录但保留所有文件,然后您可以重新发送它们。 (如果您要删除文件以删除--keep hg strip -r 5888

答案 8 :(得分:3)

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

HG Tortoise Image

答案 9 :(得分:0)

除了Samaursa的出色答案之外,您还可以将evolve扩展名prune用作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,可以保持工作目录完整,以便您重新提交文件。