Mercurial – 恢复到旧版本并从那里继续

我在本地使用Mercurial进行项目(这是唯一一个没有任何其他地方推/拉的回购)。

迄今为止,它有一个线性的历史。 然而,目前我正在做的事情,我现在已经意识到是一个可怕的方法,我想回到这个版本之前,我开始实施它不同的方式。

我对Mercurial中的branch / revert / update -C命令有点困惑。 基本上我想恢复到版本38(目前在45),并有我的下一个承诺有38作为父母,从那里进行。 我不在乎修订版39-45是否永远丢失,或者最终落入他们自己的死胡同里。

我需要哪个命令/一组命令?

 hg update [-r REV] 

如果以后你提交,你将有效地创build一个新的分支。 那么你可能会继续在这个分支上工作,或者最终将现有的合并到它。

这里是命令的备忘单:

  • hg update更改您的工作副本父版本,并更改​​文件内容以匹配此新的父版本。 这意味着新的提交将从您更新的版本继续进行。

  • hg revert改变文件内容,并且只留下工作副本的父版本。 当您决定不希望在工作副本中保留对文件进行的无限更改时,通常使用hg revert

  • hg branch启动一个新的命名分支。 将一个命名分支想象为分配给变更集的标签。 所以如果你把hg branch red ,那么下面的变更集将被标记为属于“红色”分支。 这可以是组织变更集的一种很好的方式,特别是当不同的人在不同的分支上工作时,您以后想要查看变更集来自哪里。 但是你不想在你的情况下使用它。

如果你使用hg update --rev 38 ,那么39-45的变化将被视为一个死胡同 – 我们称它为一个摇摇欲坠的头。 当您推送时,您将会收到警告,因为您将在要推送的存储库中创build“多个头”。 这个警告是存在的,因为他们build议有人需要合并,所以把这样的头留下来是不礼貌的。 但在你的情况下,你可以继续前进,因为你真的想把它挂起来。

如果你还没有把修订版39-45推到别的地方,那么你可以把它们保密。 这非常简单:使用hg clone --rev 38 foo foo-38您将得到一个新的本地克隆,它只包含到版本38的版本。您可以继续使用foo-38并推送您创build的新(良好)更改集。 你的foo克隆版本中仍然会有旧的(坏的)版本。 (你可以自由地重命名克隆,例如, foofoo-badfoo-38foo 。)

最后,你也可以使用hg revert --all --rev 38 ,然后提交。 这将创build一个修订版本46,看起来与修订版本38相同。然后,​​您将继续从修订版本46开始工作。这不会像hg update一样以明确的方式在历史logging中创build分支,但另一方面,您将无法获得投诉关于有多个头。 如果我正在与其他已经根据修订版本45做了自己的工作的人合作,我会使用hg revert否则, hg update会更明确。

我刚刚遇到了一个需要将一个文件恢复到之前的修订版本的情况,在我完成提交和推送之后。 用于指定这些修订版的简写语法不包含在其他答案中,所以这里是命令

 hg revert path/to/file -r-2 

-2将会恢复到上次提交之前的版本,使用-1将会恢复当前未提交的更改。

恕我直言, hg strip -r 39适合这种情况。

它需要启用mq扩展,并具有与Martin Geisler推荐的“克隆回购方法”相同的限制:如果更改集以某种方式发布,它可能(可能)会在某个时间点返回到您的回购,因为您只是改变了你当地的回购

在使用hg update -r REV ,关于如何提交该更改的答案并不清楚,以便随后可以推送。

如果你只是尝试提交更新后,Mercurial不认为有任何更改。

我必须首先对任何文件进行更改(比如在自述文件中),以便Mercurial意识到我做了一个新的更改,然后我可以执行此操作。

然后这个提到了两个头。

为了在推动之前摆脱另一个负责人,我遵循了“ 无操作合并”步骤来纠正这种情况。

那时我能够推动。

上面的答案是最有用的,我学到了很多东西。 但是,为了我的需要,简洁的答案是:

hg revert –all –rev $ {1}

hg commit -m“恢复分支$ {1}为默认值”

$ {1}是修订号或分支名称。 这两行实际上是一个bash脚本的一部分,但是如果你想手动完成的话,它们可以正常工作。

如果您需要为发布分支添加一个热修复,但是需要从默认生成(直到我们获得了我们的CI工具并且能够从分支生成并且稍后取消发布分支),这是非常有用的。

我会安装Tortoise Hg(一个免费的Mercurial GUI)并使用它。 然后,您可以右键单击您想要返回的修订版本(所有提交信息都在眼前),然后select“还原所有文件”。 使其直观易用,在文件集版本之间前后滚动,如果您希望确定何时出现问题,这可能非常有用。