Mercurial - 恢复到旧版本并从那里继续
我在本地为一个项目使用Mercurial(这是唯一一个没有任何其他地方推/拉的回购)。
迄今为止,它有一个线性的历史。 然而,目前我正在处理的事情现在已经意识到是一种可怕的方法,我想在开始之前回到该版本并以不同的方式实施它。
我对Mercurial中的branch
/ revert
/ update -C
命令有点困惑。 基本上我想恢复到版本38(目前是45),并让我的下一个提交有38作为父项,并从那里继续。 我不在乎修订版39-45是否永久丢失或最终落入他们自己的死胡同分支。
我需要哪个命令/命令集?
hg update [-r REV]
如果以后你提交,你将有效地创建一个新的分支。 然后,您可能只会继续在此分支上工作,或者最终将现有分析合并到该分支中。
这里是命令的备忘单:
hg update
更改您的工作副本父版本,并更改文件内容以匹配此新的父版本。 这意味着新的提交将从您更新的版本继续进行。
hg revert
仅更改文件内容并且仅保留工作副本父版本。 当您决定不希望在工作副本中保留对文件所做的无保留更改时,通常会使用hg revert
。
hg branch
启动一个新的命名分支。 将一个命名分支想象为您分配给变更集的标签。 因此,如果您将hg branch red
设为hg branch red
,则以下更改集将标记为属于“红色”分支。 这可以是组织变更集的一种很好的方式,尤其是当不同的人员在不同的分支上工作并且您稍后想要查看变更集来自何处时。 但是你不想在你的情况下使用它。
如果您使用hg update --rev 38
,则更改集39-45将被视为死胡同 - 我们称之为hg update --rev 38
头。 由于您将在要推送的存储库中创建“多个磁头”,因此您在推送时会收到警告。 警告是存在的,因为他们建议有人需要合并,因此将这些头部留下来是不礼貌的。 但是,在你的情况,你可以先走一步, hg push --force
,因为你真的要离开它挂。
如果您还没有将修订版39-45推到其他地方,那么您可以将它们保密。 这非常简单:使用hg clone --rev 38 foo foo-38
您将得到一个新的本地克隆,它只包含最多38版。您可以继续使用foo-38
并推送您创建的新(良好)变更集。 你的foo
克隆中仍然会有旧的(坏的)修订版本。 (你可以自由地重命名克隆,例如, foo
为foo-bad
, foo-38
为foo
。)
最后,你也可以使用hg revert --all --rev 38
然后提交。 这将创建一个修订版本46,与修订版本38相同。然后,您将继续从修订版本46开始工作。这不会像hg update
那样以明确的方式在历史记录中创建分支,但是另一方面,您将无法获得投诉关于有多个头。 如果我正在与其他已经根据修订版45做出自己的工作的人合作,我会使用hg revert
否则, hg update
会更加明确。
刚刚完成提交和推送后,我刚遇到需要将一个文件恢复到之前修订版的情况。 用于指定这些修订的简写语法不包含在其他答案中,因此这里是命令
hg revert path/to/file -r-2
-2
会在最后一次提交前恢复到版本,使用-1
将会恢复当前未提交的更改。
上一篇: Mercurial — revert back to old version and continue from there