Mercurial Hg:删除最新提交

Mercurial Hg:删除最新提交,mercurial,undo,Mercurial,Undo,我过去使用过Git,我是一个Hg noob: 我有以下存储库结构: o [> default] commit A | o commit B . . . o <a-tag] | 现在(在推之前),我意识到我的提交是基于错误的提交的commit C和commit D。我如何回到初始状态(无需重新克隆存储库)并删除这些提交commit C和commit D(挂件到git reset——硬a标签)?我只需从适当的点克隆并删除旧的repo。 如果没有克隆,请考虑 HG退出/撤销第一个C和D,

我过去使用过Git,我是一个Hg noob:

我有以下存储库结构:

o [> default] commit A
|
o commit B
.
.
.
o <a-tag]
|

现在(在推之前),我意识到我的提交是基于错误的提交的
commit C
commit D
。我如何回到初始状态(无需重新克隆存储库)并删除这些提交
commit C
commit D
(挂件到
git reset——硬a标签
)?

我只需从适当的点克隆并删除旧的repo。 如果没有克隆,请考虑<代码> HG退出/<代码>撤销第一个C和D,或者,如果这是您的最终目标<代码> HG ReBase< /C> >将C和D都移到<代码>提交点。

< P> C+DouthDD将删除这2个提交,但添加另外3个(退回+退出+合并)。“干净”从历史记录中删除可能是错误的

  • 扩展(“删除”命令)
  • (/first steps/和drop mq队列)

如果您只想将错误的父项更改为正确的,那么您必须使用rebase,正如@chill所提到的您所说的不进行克隆,我将对此进行说明,但首先让我指出,这样做:

cd ..
hg clone -r -2 yourrepo yournewrepo
是一个即时操作,它在本地为您获取一个新克隆,而不必在旧repo中提交最后两次。因为它是本地克隆,所以它使用硬链接(甚至在Windows上),所以存储库不会占用额外的磁盘空间

这是经典的Mercurial解决方案。Mercurial是以一段永恒的历史为理念建立起来的。如果历史上有什么东西你后悔你犯了相反的错误(这就是
回退所做的),那么历史会显示错误及其更正——就像科学家的日志一样。如果你不能/不能忍受它出现在历史上,你会像我上面展示的那样做一个排除它的克隆


不是每个人都能如此。。。中坚分子。。。关于它们的历史记录,因此出现了许多将修改历史记录的扩展,但它们必须特别启用。在您的例子中,您已经安装的
rebase
扩展(现在随Mercurial提供)将完全满足您的需要。您只需要在
~/.hgrc
中启用它,然后将D重新分配到A上。如果您真的只想让C消失,那么
mq
扩展中的
strip
命令就可以做到这一点。它还附带Mercurial。

您可以使用“strip”永久删除提交及其所有子体。在您的情况下,您需要指定“D”版本的id:

hg strip -r D
注意:必须打开mq扩展:

[extensions]
mq=
Mercurial在.hg/strip backup中备份剥离的变更集包,所以此操作相当安全

[extensions]
mq=