我在使用Mercurial过程中常常犯一个愚蠢的错误。通常情况下,在未执行“hg pull”和“hg update”的情况下开始工作。当我尝试推送我的更改时,就会出现错误。
有没有办法删除我的本地提交,以避免创建多个头、分支等?我只想删除我的本地提交,将我的更改与tip合并,然后重新提交。听起来很简单,对吧?但我似乎找不到任何轻松删除本地提交的方法,以便我可以干净地与tip合并。
再次说明,我只想删除使用“hg ci”进行的本地提交。我不想修改文件、回滚等。
我在使用Mercurial过程中常常犯一个愚蠢的错误。通常情况下,在未执行“hg pull”和“hg update”的情况下开始工作。当我尝试推送我的更改时,就会出现错误。
有没有办法删除我的本地提交,以避免创建多个头、分支等?我只想删除我的本地提交,将我的更改与tip合并,然后重新提交。听起来很简单,对吧?但我似乎找不到任何轻松删除本地提交的方法,以便我可以干净地与tip合并。
再次说明,我只想删除使用“hg ci”进行的本地提交。我不想修改文件、回滚等。
启用“strip”扩展并输入以下内容:
hg strip #changeset# --keep
其中#changeset#
是您想要删除的更改集的哈希值。这将删除该更改集,包括从它派生的更改集,并且不会影响您的工作目录。如果您希望还原已提交的代码更改,请删除--keep
选项。
有关更多信息,请查看Strip Extension。
如果出现“未知命令'strip'”的情况,则可能需要启用它。为此,请找到.hgrc
或Mercurial.ini
文件,并添加以下内容:
[extensions]
strip =
strip
命令非常有用。实际上,如果您处于此问题的情况,并且您想永久性地完全删除所有“草稿”变更集,请查看顶部答案,它基本上建议执行以下操作:hg strip 'roots(outgoing())'
如果你正在使用Hg Tortoise,只需在以下位置激活扩展程序“strip”:
- 文件/设置/扩展程序/
- 选择strip
然后通过在底部修订版上进行右键单击
并选择来选择你想要开始剪切的版本:
- 修改历史记录
- 剪切
就像这样:
在这个例子中,它将从第19个版本到最后一个提交(22)清除。
--keep
,而TortoiseHg没有提供该选项。因此...您需要在命令行中使用hg strip -r . --keep
进行操作。 - Tim Tisdall现代答案(仅适用于Mercurial 2.1之后的版本):
使用Phases,将您不想共享的修订标记为保密(私人)。这样当您推送时,它们就不会被发送。
在TortoiseHG中,您可以右键单击提交以更改其阶段。
此外:您还可以使用扩展名“rebase”将本地提交移动到拉取后的共享存储库的头部。
正如其他人所指出的那样,你可能只需拉取并合并头部即可,但如果你真的想在不使用修改历史记录工具的情况下摆脱你的提交,那么你可以使用hg clone -r
来克隆你的存储库以获取除了这些更改之外的所有内容.
这不会从原始存储库中删除它们,但它创建了一个新的克隆,不包含它们。然后你可以删除你修改过的存储库(如果你想的话)。
我也遇到了这个问题。我进行了2次commit
,想要回滚并且删除这两个commit
。
$ hg rollback
hg rollback
只回滚到上一个提交,而不是两个提交。当时我没有意识到这一点,所以我改动了代码。hg rollback
只回滚了一个提交后,我发现我可以使用 hg strip #changeset#
。因此,我使用hg log -l 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 -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
hg pull --rebase
,你的提交将自动重新提交到已拉取的修订版中,避免分支问题。hg strip
是您要寻找的内容。如果您熟悉git,则类似于git reset
。
使用控制台:
您需要知道修订版本号。hg log -l 10
。此命令显示最近的10个提交。查找您要查找的提交。您需要来自changeset行的4位数字changeset: 5888:ba6205914681
然后运行hg strip -r 5888 --keep
。这将删除提交记录,但保留所有修改的文件,然后您可以重新提交它们。
(如果您想要删除文件,只需删除--keep hg strip -r 5888
)
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
也像strip
一样有--keep
选项,以保留工作目录,使您能够重新提交文件。