因此,我在Mercurial中犯了一个愚蠢的错误。很多时候,我会在不进行“汞拉”和“汞更新”的情况下开始工作。当我尝试推送更改时,出现错误。
有什么方法可以删除我的本地提交,以便避免创建多个标头,分支等吗?我只想删除本地提交,将更改与提示合并,然后重新提交。听起来很简单,对吧?我似乎找不到任何轻松删除本地提交的方法,因此可以与技巧完美地合并。
同样,我只想删除使用“ hg ci”进行的本地提交。我不想修改文件,还原等。
因此,我在Mercurial中犯了一个愚蠢的错误。很多时候,我会在不进行“汞拉”和“汞更新”的情况下开始工作。当我尝试推送更改时,出现错误。
有什么方法可以删除我的本地提交,以便避免创建多个标头,分支等吗?我只想删除本地提交,将更改与提示合并,然后重新提交。听起来很简单,对吧?我似乎找不到任何轻松删除本地提交的方法,因此可以与技巧完美地合并。
同样,我只想删除使用“ hg ci”进行的本地提交。我不想修改文件,还原等。
Answers:
启用“ strip ”扩展名并输入以下内容:
hg strip #changeset# --keep
#changeset#
您要删除的变更集的哈希在哪里。这将删除所说的变更集,包括从其衍生出来的变更集,并使您的工作目录保持不变。如果您还希望还原已提交的代码更改,请删除该--keep
选项。
有关更多信息,请检查Strip Extension。
如果收到“未知命令'strip'”,则可能需要启用它。为此,请找到.hgrc
或Mercurial.ini
文件,然后在其中添加以下内容:
[extensions]
strip =
请注意(如Juozas在他的评论中所提到的),在Mercurial中,拥有多个负责人是正常的工作流程。您不应该使用strip命令来解决这个问题。相反,您应该将自己的头部与传入的头部合并,解决所有冲突,进行测试,然后再进行推送。
strip
当您确实想摆脱污染分支的变更集时,此命令很有用。实际上,如果您处于此问题的状况中,并且想要永久性地完全删除所有“草稿”变更集,请查看最上面的答案,该答案基本上建议您这样做:
hg strip 'roots(outgoing())'
strip =
很好。Mercurial 2.8的新增功能
如果您使用的是汞龟,只需在以下位置激活扩展名“ strip ”:
- 文件/设置/扩展名/
- 选择条
然后,从您要开始分割的地方选择底部修订版,right click
对其进行操作,然后选择:
- 修改记录
- 跳闸
像这样:
在此示例中,它将从第19版删除到最后一次提交(22)。
File/Settings/Extensions/
我希望我可以增加选票。非常感谢你!
--keep
而TortoiseHg则不提供该选项。因此...您需要在命令行中使用hg strip -r . --keep
。
现代答案(仅在Mercurial 2.1之后才适用):
使用阶段并将您不想共享的修订标记为秘密(私有)。这样一来,当您推送时,他们将不会被发送。
在TortoiseHG中,您可以右键单击提交以更改其阶段。
另外:您还可以在扩展后使用扩展名“ rebase”将本地提交移动到共享存储库的头部。
正如其他所有人所指出的那样,您可能应该先拉然后合并这些头,但是如果您确实想在没有任何EditingHistory工具的情况下摆脱提交,那么您只需hg clone -r
回购即可获得所有更改。
这不会从原始存储库中删除它们,但是会创建一个没有它们的新克隆。然后,您可以删除修改的存储库(如果需要)。
我也遇到了这个问题。我做了2个commit
,想回滚和删除两个提交。
$ hg rollback
但是hg rollback
只是回滚到最后一次提交,而不是两次提交。当时我没有意识到这一点,所以我更改了代码。
当我发现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
比较文件,然后将代码重新添加到项目中。
$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
使用Rebase扩展,您可以更加轻松地解决此问题,只需使用它hg pull --rebase
,您的提交就会自动重新提交到拉出的修订版,从而避免出现分支问题。
除了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
,可以保持工作目录完整无缺,以便您重新提交文件。