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

use*_*535 202 mercurial

所以我在Mercurial中犯了一个愚蠢的错误.很多时候,我会在没有做"hg pull"和"hg update"的情况下开始工作.当我尝试推送我的更改时,出现错误.

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

我再次尝试删除使用"hg ci"进行的本地提交.我不想修改文件,还原等.

Sam*_*rsa 238

启用" strip "扩展并键入以下内容:

hg strip #changeset# --keep
Run Code Online (Sandbox Code Playgroud)

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

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

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

[extensions]
strip =
Run Code Online (Sandbox Code Playgroud)

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

strip当您真的想要摆脱污染分支的变更集时,该命令很有用.事实上,如果你处于这个问题的状态并想要永久地完全删除所有"草稿"变更集,请查看最佳答案,这基本上建议:

hg strip 'roots(outgoing())'
Run Code Online (Sandbox Code Playgroud)

  • @Bharath:您需要启用扩展程序 (8认同)

Eli*_*iuX 99

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

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

然后选择要开始条带化的底部修订,通过执行right click操作,然后选择:

  1. 修改历史记录
  2. 跳闸

像这样:

在此输入图像描述

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

  • `文件/设置/扩展名/'我希望我可以增加更多票数。非常感谢你! (2认同)
  • 我似乎无法找到一种方法来正确地做到这一点,但似乎要保留你需要通过`--keep`的内容,而TortoiseHg并没有给出那个选项.所以......你需要在`hg strip -r的命令行中完成它.--keep`. (2认同)
  • 来自strip帮助:'任何剥离的变更集都作为一个包存储在".hg/strip-backup"中(参见"hg help bundle"和"hg help unbundle").它们可以通过运行"hg unbundle .hg/strip-backup/BUNDLE"来恢复,其中BUNDLE是由条带创建的包文件. (2认同)

Tom*_*eys 21

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

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

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

另外:您还可以使用扩展"rebase"将您的本地提交移动到共享存储库的头部.


Ry4*_*ase 15

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

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

  • 它不会从克隆的存储库中删除它们,但会创建一个没有它们的新克隆.然后,如果您愿意,可以删除您修改的仓库. (4认同)

too*_*php 9

您可以使用Rebase扩展更轻松地解决这个问题,只需使用hg pull --rebase,您的提交会自动重新调整到撤销的版本,从而避免分支问题.


Goi*_*Way 9

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

$ hg rollback
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

什么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#
Run Code Online (Sandbox Code Playgroud)

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

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
Run Code Online (Sandbox Code Playgroud)


neo*_*neo 5

如果你熟悉git,你会很乐意使用类似于它的heteditgit rebase -i.


小智 5

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