我过去曾经使用过Git,而且我是一名Hg noob:
我有以下存储库结构:
o [> default] commit A
|
o commit B
.
.
.
o <a-tag]
|
我已使用a-tag
更新到提交,并提交了一些其他提交。现在我有了
o [> default] commit C
|
o commit D
|
| o [default] commit A
| |
| o commit B
| .
| .
| .
| /
o <a-tag]
|
现在(在推送之前)我意识到我根据错误的提交提交了我的提交commit C
和commit D
。如何才能返回初始状态(无需重新克隆存储库),将这些提交commit C
和commit D
(git reset --hard a-tag
的吊坠)丢弃?
答案 0 :(得分:8)
您可以使用'strip'永久删除提交及其所有后代。在您的情况下,您需要指定“D”版本的ID:
hg strip -r D
注意:必须打开mq扩展名:
[extensions]
mq=
Mercurial备份.hg / strip-backup中剥离的变更集的捆绑包,因此此操作相当安全。
答案 1 :(得分:4)
你说没有克隆,我会接受,但首先让我指出这样做:
cd ..
hg clone -r -2 yourrepo yournewrepo
是一个即时操作,可以在本地为您提供一个新的克隆,而无需在旧存储库中进行最后两次提交。因为它是本地克隆,所以它使用硬链接(甚至在Windows上),因此存储库不会占用额外的磁盘空间。
这是经典的Mercurial解决方案。 Mercurial建立在一个不可改变的历史的基础上。如果历史中有什么东西你后悔你提交它的逆(这是backout
的作用),所以历史记录显示错误及其修正 - 就像科学家的日志一样。如果你不能/不能在历史中遵守它,你就会像我上面所展示的那样做一个排除它的克隆。
不是每个人都可以如此......硬核......关于他们的历史,所以很多扩展已经出现,将修改历史,但必须特别启用。在您的情况下,您已安装的rebase
扩展程序(现在随附Mercurial)将完全按照您的要求执行。您只需要在~/.hgrc
中启用它,然后将D重新映射到A.如果您真的只想要C消失,strip
扩展名中的mq
命令就会这样做。它还附带Mercurial。
答案 2 :(得分:1)
我只是从适当的点克隆并删除旧的仓库。
如果没有克隆,请考虑hg backout
撤消第一个C然后撤消D,或者,如果这是您的最终目标hg rebase
,则将C和D都移动到commit A
点。
答案 3 :(得分:1)
Backout C + backout D将删除这两个提交,但添加额外的3(退出+退出+合并)。 “清理”从历史中删除可能
如果您只想更改错误的父级更正,则必须使用rebase,如@chill所述