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

225

我在使用Mercurial过程中常常犯一个愚蠢的错误。通常情况下,在未执行“hg pull”和“hg update”的情况下开始工作。当我尝试推送我的更改时,就会出现错误。

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

再次说明,我只想删除使用“hg ci”进行的本地提交。我不想修改文件、回滚等。


可能是重复的 https://dev59.com/mXI95IYBdhLWcg3w1BdN - N 1.1
14
这不是一个愚蠢的错误,当多人同时使用同一代码库时,这是正常的工作流程。 - Juozas Kontvainis
10个回答

262

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

hg strip #changeset# --keep

其中#changeset#是您想要删除的更改集的哈希值。这将删除该更改集,包括从它派生的更改集,并且不会影响您的工作目录。如果您希望还原已提交的代码更改,请删除--keep选项。

有关更多信息,请查看Strip Extension

如果出现“未知命令'strip'”的情况,则可能需要启用它。为此,请找到.hgrcMercurial.ini文件,并添加以下内容:

[extensions]
strip =

请注意(正如Juozas在评论中提到的那样),在Mercurial中拥有多个heads是正常的工作流程。您不应该使用strip命令来解决这个问题。相反,您应该将您的head与传入的head合并,解决任何冲突,测试,然后推送。
当您真正想要摆脱污染分支的变更集时,strip命令非常有用。实际上,如果您处于此问题的情况,并且您想永久性地完全删除所有“草稿”变更集,请查看顶部答案,它基本上建议执行以下操作:
hg strip 'roots(outgoing())'

8
@Bharath:您需要启用该扩展。 - Samaursa
1
自Mercurial 2.8以来,strip成为一个独立的扩展,因此只需使用strip = 即可。Mercurial 2.8的新特性 - Chih-Hsuan Yen

115

如果你正在使用Hg Tortoise,只需在以下位置激活扩展程序“strip”:

  1. 文件/设置/扩展程序/
  2. 选择strip

然后通过在底部修订版上进行右键单击并选择来选择你想要开始剪切的版本:

  1. 修改历史记录
  2. 剪切

就像这样:

输入图像描述

在这个例子中,它将从第19个版本到最后一个提交(22)清除。


3
“文件/设置/扩展”,我希望我能投更多的票。非常感谢! - dyatchenko
啊!我尝试了这个,但它似乎抛弃了我所有的更改,尽管我没有勾选“无备份”或“放弃本地更改”。我想保留这些更改,只是不想提交它们!现在有什么办法可以恢复它们吗? - Tim Tisdall
3
我似乎找不到正确的方法,但好像要保留内容需要传递--keep,而TortoiseHg没有提供该选项。因此...您需要在命令行中使用hg strip -r . --keep进行操作。 - Tim Tisdall
4
根据strip帮助文档:“任何被剥离的变更集都会以一个捆绑文件的形式存储在“.hg/strip-backup”目录下(请参考“hg help bundle”和“hg help unbundle”)。您可以通过运行命令“hg unbundle .hg/strip-backup/BUNDLE”来还原这些变更集,其中BUNDLE是strip操作生成的捆绑文件名。” - Tim Tisdall
在SourceTree中也很有用。谢谢! - Ponomarenko Oleh

23

现代答案(仅适用于Mercurial 2.1之后的版本):

使用Phases,将您不想共享的修订标记为保密(私人)。这样当您推送时,它们就不会被发送。

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

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


私有 == 现在是秘密 - Dmitry Osinovskiy

17

正如其他人所指出的那样,你可能只需拉取并合并头部即可,但如果你真的想在不使用修改历史记录工具的情况下摆脱你的提交,那么你可以使用hg clone -r来克隆你的存储库以获取除了这些更改之外的所有内容.

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


“hg clone -r” 会删除本地更改吗?我只想删除本地提交以保持简单。 - user191535
4
它不会从克隆的仓库中删除它们,而是创建一个没有它们的新克隆。然后,如果您想要的话,可以删除您修改过的仓库。 - Ry4an Brase

11

我也遇到了这个问题。我进行了2次commit,想要回滚并且删除这两个commit

$ hg rollback

但是hg rollback 只回滚到上一个提交,而不是两个提交。当时我没有意识到这一点,所以我改动了代码。
当我发现 hg rollback 只回滚了一个提交后,我发现我可以使用 hg strip #changeset#。因此,我使用hg log -l 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 -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

10
你可以通过变基扩展更容易地解决此问题,只需使用hg pull --rebase,你的提交将自动重新提交到已拉取的修订版中,避免分支问题。

1
以牺牲准确的历史记录和可能出现的损坏为代价,如果您做错了事情。 - Ry4an Brase

6

hg strip 是您要寻找的内容。如果您熟悉git,则类似于git reset

使用控制台:

  1. 您需要知道修订版本号。hg log -l 10。此命令显示最近的10个提交。查找您要查找的提交。您需要来自changeset行的4位数字changeset: 5888:ba6205914681

  2. 然后运行hg strip -r 5888 --keep。这将删除提交记录,但保留所有修改的文件,然后您可以重新提交它们。 (如果您想要删除文件,只需删除--keep hg strip -r 5888


5

如果你熟悉git,你会很高兴使用类似于git rebase -ihistedit


4
[Hg Tortoise 4.6.1] 如果需要撤销最近的操作,您可以使用“回滚/撤消”操作(Ctrl+U)。 HG Tortoise Image

1
请仔细检查是否包含了图片。 - Bill Keller

2
除了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也像strip一样有--keep选项,以保留工作目录,使您能够重新提交文件。

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