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

Pao*_*olo 248 version-control mercurial branch dvcs revert

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

到目前为止,它有一个线性历史.然而,我正在研究的当前事情我现在已经意识到这是一种可怕的方法,我想在开始之前回到版本并以不同的方式实现它.

我对Mercurial中的branch/ revert/ update -C命令有点困惑.基本上我想恢复到版本38(目前在45)并让我的下一个提交有38作为父母并从那里继续.我不在乎修改39-45是永远丢失还是最终落入他们自己的死胡同.

我需要哪个命令/命令集?

Mar*_*ler 400

这是命令的备忘单:

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

  • hg revert仅更改文件内容并单独保留工作副本父修订.hg revert当您决定不想保留对工作副本中的文件所做的未经修改的更改时,通常会使用此选项.

  • hg branch启动一个新的命名分支.将命名分支视为您分配给变更集的标签.因此,如果您这样做hg branch red,则以下变更集将被标记为属于"红色"分支.这可以是组织变更集的一种很好的方法,特别是当不同的人在不同的分支上工作时,您以后想要查看变更集的来源.但是你不想在你的情况下使用它.

如果你使用hg update --rev 38,那么变更集39-45将留作死胡同 - 我们称之为悬空头.您推送时会收到警告,因为您将在您推送的存储库中创建"多个头".警告就在那里因为他们建议有人需要合并,所以留下这样的头脑是不礼貌的.但在你的情况下,你可以继续前进,hg push --force因为你真的想要让它悬空.

如果您还没有将修订版39-45推到其他地方,那么您可以将它们保密.它非常简单:hg clone --rev 38 foo foo-38您将获得一个仅包含最新版本38的新本地克隆.您可以继续使用foo-38并推送您创建的新(好)更改集.你的foo克隆中仍然会有旧的(坏的)修订版.(您可以根据需要自由重命名克隆,例如,footo foo-badfoo-38to foo.)

最后,您还可以使用hg revert --all --rev 38然后提交.这将创建一个修订版46,看起来与修订版38完全相同.然后你将继续使用修订版46.这不会在历史中以同样明确的方式创建一个fork hg update,但另一方面你不会抱怨有关多头.hg revert如果我与其他已根据修订版45开展自己的工作的人合作,我会使用hg update.否则,更明确.

  • +1为hg revert --all --rev X WOW.美丽. (7认同)
  • 真棒的答案.我使用了hg revert --all --rev ##并且它保存了我的屁股:D (2认同)

van*_*van 149

hg update [-r REV]
Run Code Online (Sandbox Code Playgroud)

如果稍后提交,您将有效地创建一个新分支.然后,您可以继续仅在此分支上工作或最终将现有分支合并到其中.

  • 下一次提交将创建一个新分支.如果您不确定,只需备份您的存储库(使用工作副本),尝试一下 - 不喜欢结果 - >从头开始免费 (6认同)
  • @NeonWarge REV只是修订版的占位符.它可以是它的数字,哈希,书签等等.特雷弗:这不可疑,因为它没有合并任何东西.没有必要. (2认同)

hyd*_*yde 30

我刚刚遇到一个需要将一个文件恢复到以前版本的情况,就在我完成提交和推送之后.用于指定这些修订的简写语法不包含在其他答案中,因此这里有命令来执行此操作

hg revert path/to/file -r-2
Run Code Online (Sandbox Code Playgroud)

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

  • 我确实觉得这非常有用。当然对于 -r 选项,您可以简单地提供修订号 (2认同)

mag*_*ras 7

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

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


小智 6

使用后hg update -r REV,在答案中不清楚如何提交更改,以便您可以推送.

如果您只是在更新后尝试提交,Mercurial认为没有任何更改.

我必须首先对任何文件进行更改(比如在README中),因此Mercurial认识到我做了一个新的更改,然后我可以提交.

然后如上所述创建了两个头.

为了在推动之前摆脱另一个头,然后我按照No-Op Merges步骤来解决这种情况.

然后我才能推.


小智 5

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

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"
Run Code Online (Sandbox Code Playgroud)

${1}版本号或分支名称在哪里。这两行实际上是bash脚本的一部分,但是如果您想手动执行,它们可以很好地工作。

如果您需要向发布分支添加修补程序,但是需要从默认版本进行构建,这将很有用(直到我们正确配置CI工具并能够从分支构建,然后再取消发布分支)。