有什么办法可以删除Mercurial中的本地提交?


209

因此,我在Mercurial中犯了一个愚蠢的错误。很多时候,我会在不进行“汞拉”和“汞更新”的情况下开始工作。当我尝试推送更改时,出现错误。

有什么方法可以删除我的本地提交,以便避免创建多个标头,分支等吗?我只想删除本地提交,将更改与提示合并,然后重新提交。听起来很简单,对吧?我似乎找不到任何轻松删除本地提交的方法,因此可以与技巧完美地合并。

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



12
这不是一个愚蠢的错误,当几个人同时使用同一个存储库时,这是正常的工作流程。
Juozas Kontvainis 2011年

Answers:


247

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

hg strip #changeset# --keep

#changeset#您要删除的变更集的哈希在哪里。这将删除所说的变更集,包括从其衍生出来的变更集,并使您的工作目录保持不变。如果您还希望还原已提交的代码更改,请删除该--keep选项。

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

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

[extensions]
strip =

请注意(如Juozas在他的评论中所提到的),在Mercurial中,拥有多个负责人是正常的工作流程。您不应该使用strip命令来解决这个问题。相反,您应该将自己的头部与传入的头部合并,解决所有冲突,进行测试,然后再进行推送。

strip当您确实想摆脱污染分支的变更集时,此命令很有用。实际上,如果您处于此问题的状况中,并且想要永久性地完全删除所有“草稿”变更集,请查看最上面的答案,该答案基本上建议您这样做:

hg strip 'roots(outgoing())'

8
@Bharath:你需要启用扩展
Samaursa

1
从Mercurial 2.8开始,strip是一个独立的扩展,所以strip = 很好。Mercurial 2.8的新增功能
日元

104

如果您使用的是汞龟,只需在以下位置激活扩展名“ strip ”:

  1. 文件/设置/扩展名/
  2. 选择

然后,从您要开始分割的地方选择底部修订版,right click对其进行操作,然后选择:

  1. 修改记录
  2. 跳闸

像这样:

在此处输入图片说明

在此示例中,它将从第19版删除到最后一次提交(22)。


2
File/Settings/Extensions/我希望我可以增加选票。非常感谢你!
dyatchenko

啊!我尝试了此操作,但尽管未选中“不备份”或“放弃本地更改”,但它似乎转储了所有更改。我想保留这些更改,只是不提交!现在有什么办法可以恢复它们吗?
蒂姆·迪斯达尔

2
我似乎找不到合适的方法,但是似乎要保留需要传递的内容,--keep而TortoiseHg则不提供该选项。因此...您需要在命令行中使用hg strip -r . --keep
Tim Tisdall 2015年

3
从剥离帮助中:'任何剥离的变更集都作为捆绑存储在“ .hg / strip-backup”中(请参阅“ hg帮助捆绑”和“ hg帮助解除捆绑”)。可以通过运行“ hg unbundle .hg / strip-backup / BUNDLE”来还原它们,其中BUNDLE是该条带创建的捆绑文件。
蒂姆·迪斯达尔

在SourceTree中也很有用。谢谢!
Ponomarenko Oleh

22

现代答案(仅在Mercurial 2.1之后才适用):

使用阶段并将您不想共享的修订标记为秘密(私有)。这样一来,当您推送时,他们将不会被发送。

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

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


私人==现在秘密
Dmitry Osinovskiy 2014年

15

正如其他所有人所指出的那样,您可能应该先拉然后合并这些头,但是如果您确实想在没有任何EditingHistory工具的情况下摆脱提交,那么您只需hg clone -r回购即可获得所有更改。

这不会从原始存储库中删除它们,但是会创建一个没有它们的新克隆。然后,您可以删除修改的存储库(如果需要)。


“ hg clone -r”是否删除本地更改?我只想删除本地提交以使事情简单。
user191535 2010年

4
它不会从克隆的存储库中删除它们,但是会创建一个没有它们的新克隆。然后,您可以根据需要删除修改的存储库。
Ry4an Brase

9

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

$ hg rollback

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

当我发现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比较文件,然后将代码重新添加到项目中。

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

9

使用Rebase扩展,您可以更加轻松地解决此问题,只需使用它hg pull --rebase,您的提交就会自动重新提交到拉出的修订版,从而避免出现分支问题。


1
如果您做错了事情,则会以不正确的历史记录和可能的损坏为代价。
Ry4an Brase 2011年

5

如果您熟悉git,则很乐意使用像git 这样的histeditgit rebase -i


4

hg strip是您要寻找的。这类似于git reset您是否熟悉git。

使用控制台:

  1. 您需要知道修订号。hg log -l 10。该命令显示最近的10次提交。查找您要查找的提交。您需要变更集行中的4位数字changeset: 5888:ba6205914681

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


1

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

HG乌龟图片


仔细检查是否包含图像。
比尔·凯勒

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,可以保持工作目录完整无缺,以便您重新提交文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.