首页 文章

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

提问于
浏览
239

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

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

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

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

7 回答

  • 386
    hg update [-r REV]
    

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

  • 7

    这是命令的备忘单:

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

    • hg revert 仅更改文件内容并单独保留工作副本父修订 . 当您决定对工作副本中的文件做出't want to keep the uncommited changes you'时,通常使用 hg revert .

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

    如果你使用 hg update --rev 38 ,那么更改集39-45将留作死胡同 - 我们称之为悬空头 . 你留下这样的头脑是不礼貌的,因为他们认为有人需要合并 . 但在你的情况下,你可以继续前进 hg push --force ,因为你真的想让它悬空 .

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

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

  • 1

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

    hg revert path/to/file -r-2
    

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

  • 29

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

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

  • 6

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

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

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

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

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

    然后我才能推 .

  • 3

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

    hg revert --all --rev ${1}
    
    hg commit -m "Restoring branch ${1} as default"
    

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

    如果您需要向发布分支添加一个热修复,但需要从默认构建(直到我们正确地使用CI工具并且能够从分支构建并随后取消发布分支),这将非常有用 .

  • 143

    我将安装Tortoise Hg(Mercurial的免费GUI)并使用它 . 那你可以右键单击您可能想要返回的修订版 - 将所有提交消息放在您眼前 - 并“还原所有文件” . 使其直观且易于在文件集版本之间前后翻转,如果您希望确定问题何时首次出现,这可能非常有用 .

相关问题