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

所以我一直在Mercurial做一个愚蠢的错误。 很多时候,我会开始工作,不做“hg pull”和“hg update”。 当我尝试推送我的更改时,出现错误。

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

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

启用“ mq ”扩展名并键入以下内容:

hg strip #changeset# 

其中#changeset#是要删除的变更集的散列。 这将删除所述变更集, 包括从其下降的变更集。

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

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

 [extensions] mq = 

注意(正如Juozas在他的评论中提到的那样)有多个头是Mercurial的正常工作stream程。 你不应该使用strip命令来对抗。 相反,你应该把你的脑袋与头脑融合,解决冲突,testing,然后推。

当你真的想要摆脱污染分支的变更集时, strip命令很有用。 事实上,如果你是在这个问题的情况下,你想彻底删除所有的“草案”变更集永久,检查出最好的答案 ,这基本上build议做:

 hg strip 'roots(outgoing())' 

如果您正在使用Hg乌龟,只需激活扩展名“ mq ”:

  1. 文件/设置/扩展/
  2. selectmq

然后从你想要开始分条的地方select最下面的版本,通过right click它并select:

  1. 修改历史
  2. 跳闸

像这样:

在这里输入图像说明

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

正如其他人都指出,你应该拉,然后合并头,但如果你真的想摆脱你的提交,没有任何的EditingHistory工具,那么你可以只hg clone -r你的回购得到所有除了这些变化。

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

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

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

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

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

 $ hg rollback 

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

当我发现hg rollback刚刚回滚一个提交时,我发现我可以使用hg strip #changeset# 。 所以,我用hg log -l 10find最新的10个提交,并得到我想要strip的正确changeset。

 $ 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 

你可以使用Rebase扩展更容易地解决这个问题,只需使用hg pull --rebase ,你的提交会自动重新分配给拉取版本,避免分支问题。

如果你熟悉git,你会很乐意使用像git rebase -i那样工作的histedit 。

hg strip是你正在寻找的东西。 如果你熟悉git,那么它就是git reset的类比。

使用控制台:

  1. 你需要知道修订号。 hg log -l 10 。 这个命令显示最后的10个提交。 find你正在寻找的提交。 您需要更改行changeset: 5888:ba6205914681 4位数字changeset: 5888:ba6205914681

  2. 然后hg strip -r 5888 --keep 。 这删除了关于提交的logging,但保留所有文件修改,然后你可以重新承诺。 (如果你想删除文件,只需删除–keep hg strip -r 5888