所以我在Mercurial中犯了一个愚蠢的错误。很多时候,我会在没有做“hg pull”和“hg update”的情况下开始工作。当我试图推动我的更改时,我收到了错误。
有没有办法删除我的本地提交,这样我就可以避免创建多个头,分支等?我只想删除我的本地提交,将我的更改与提示合并,然后重新提交。听起来很简单吧?我似乎无法找到任何方法轻松删除本地提交,以便我可以干净地与提示合并。
同样,我只是想删除用“hg ci”制作的本地提交。我不想修改文件,还原等等。
答案 0 :(得分:230)
启用“ strip ”扩展名并输入以下内容:
hg strip #changeset# --keep
其中#changeset#
是要删除的变更集的哈希值。这将删除所谓的变更集包括从中变为的变更集,并将保持您的工作目录不变。如果您还希望还原已提交的代码更改,请删除--keep
选项。
有关详细信息,请查看Strip Extension。
如果你得到“未知命令'strip'”,你可能需要启用它。为此,请找到.hgrc
或Mercurial.ini
文件,并将以下内容添加到其中:
[extensions]
strip =
注意(正如Juozas在他的评论中所提到的)有多个头是Mercurial中的正常工作流程。你不应该使用strip命令来对抗它。相反,您应该将头部与传入头部合并,解决任何冲突,测试,然后推送。
当你真的想要摆脱污染分支的变更集时,strip
命令很有用。事实上,如果您处于this question状态并且想要永久删除所有“草稿”更改集,请查看the top answer,这基本上建议:
hg strip 'roots(outgoing())'
答案 1 :(得分:92)
如果你正在使用Hg Tortoise,只需激活扩展名“ strip ”:
- 文件/设置/扩展/
- 选择 strip
醇>
然后选择要开始条带化的底部修订版,在其上执行right click
,然后选择:
- 修改历史记录
- 条
醇>
就像这样:
在这个例子中,它将从第19个修订版删除到最后一个修订版(22)。
答案 2 :(得分:19)
现代答案(仅在Mercurial 2.1之后有关):
使用Phases并将您不想共享的修订标记为机密(私有)。这样,当你推动他们将不会被发送。
在TortoiseHG中,您可以右键单击提交以更改其阶段。
另外:您也可以使用扩展名“rebase”将您的本地提交移动到共享存储库的头部。
答案 3 :(得分:14)
正如其他人都在指出你应该只是拉动然后合并头部,但是如果你真的想要在没有任何EditingHistory工具的情况下摆脱你的提交,那么你可以hg clone -r
你的回购除了那些变化之外什么都没有。
这不会将它们从原始存储库中删除,但会创建一个没有它们的新克隆。然后你可以删除你修改过的仓库(如果你愿意的话)。
答案 4 :(得分:9)
您可以使用Rebase extension更轻松地解决这个问题,只需使用hg pull --rebase
,您的提交就会自动重新调整到撤消修订版本,从而避免出现分支问题。
答案 5 :(得分:9)
我也遇到过这个问题。我做了2 commit
并想要回滚并删除两个提交。
$ hg rollback
但是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
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
将diff文件和代码添加回项目中。
$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
答案 6 :(得分:5)
如果您熟悉git,您会很高兴使用git rebase -i
的{{3}}。
答案 7 :(得分:4)
hg strip
正是您要找的。如果您熟悉git,它类似于git reset
。
使用控制台:
您需要知道修订号。 hg log -l 10
。此命令显示最近10次提交。找到您正在寻找的提交。您需要从变更集行changeset: 5888:ba6205914681
然后hg strip -r 5888 --keep
。这将删除提交记录但保留所有文件,然后您可以重新发送它们。
(如果您要删除文件以删除--keep hg strip -r 5888
答案 8 :(得分:3)
答案 9 :(得分: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
,可以保持工作目录完整,以便您重新提交文件。