有什么办法可以在Mercurial中删除本地提交吗?
所以我一直在Mercurial做一个愚蠢的错误。 很多时候,我会开始工作,不做“hg pull”和“hg update”。 当我尝试推送我的更改时,出现错误。
有没有办法删除我的本地提交,所以我可以避免创build多个头,分支等? 我只想删除我的本地提交,并使用提示合并我的更改,然后重新提交。 听起来很简单吧? 我似乎无法find任何方法轻松删除本地提交,所以我可以干净地合并提示。
再次,我只是试图删除“hg ci”的本地提交。 我不想修改文件,还原等
启用“ mq ”扩展名并键入以下内容:
hg strip #changeset#
其中#changeset#
是要删除的变更集的散列。 这将删除所述变更集, 包括从其下降的变更集。
有关更多信息,请查看Strip Extension 。
如果你得到“未知的命令”strip“”,你可能需要启用它。 为此,请查找.hgrc
或Mercurial.ini
文件,并向其中添加以下内容:
[extensions] mq =
注意(正如Juozas在他的评论中提到的那样)有多个头是Mercurial的正常工作stream程。 你不应该使用strip命令来对抗。 相反,你应该把你的脑袋与头脑融合,解决冲突,testing,然后推。
当你真的想要摆脱污染分支的变更集时, strip
命令很有用。 事实上,如果你是在这个问题的情况下,你想彻底删除所有的“草案”变更集永久,检查出最好的答案 ,这基本上build议做:
hg strip 'roots(outgoing())'
如果您正在使用Hg乌龟,只需激活扩展名“ mq ”:
- 文件/设置/扩展/
- selectmq
然后从你想要开始分条的地方select最下面的版本,通过right click
它并select:
- 修改历史
- 跳闸
像这样:
在这个例子中,它将从第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 10
find最新的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 revert
和hg 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
的类比。
使用控制台:
-
你需要知道修订号。
hg log -l 10
。 这个命令显示最后的10个提交。 find你正在寻找的提交。 您需要更改行changeset: 5888:ba6205914681
4位数字changeset: 5888:ba6205914681
-
然后
hg strip -r 5888 --keep
。 这删除了关于提交的logging,但保留所有文件修改,然后你可以重新承诺。 (如果你想删除文件,只需删除–keephg strip -r 5888