【问题标题】:Restoring to an old git checkout while keeping attached to a branch在保持连接到分支的同时恢复到旧的 git checkout
【发布时间】:2014-03-13 13:48:18
【问题描述】:

我正在通过在生产服务器上运行 git pull 将应用程序部署到生产服务器。

作为备份的一部分,我正在考虑仅存储当前提交哈希而不是复制所有文件的想法。稍后,在恢复期间,我想将存储库的本地版本从远程源恢复到保存的提交哈希。理想情况下,如果我恢复了包括 .git 文件夹在内的整个树,它的行为就像它一样。

为了保存当前的提交哈希,我在想git log -1 --format=%H

为了恢复到特定版本,我知道git checkout hash 命令。不幸的是,此命令将存储库的工作副本与分支分离。

是否有一个或一组命令可以将本地 git 存储库恢复到之前的状态(也就是以透明的方式进一步更新)?因此git pull 会将工作副本更新为相应分支中的最新提交并更新 HEAD 指针等。

【问题讨论】:

    标签: git backup restore


    【解决方案1】:

    您可以签出任何提交,但这不会将.git 目录恢复到以前的状态,并且“附加到同一个分支”根本没有意义。在 git 中,分支只是对提交的引用,它启动了它来自的一系列提交。您签出的提交有其自己的历史记录,但签出会使您处于特殊的“分离头”状态(您不在任何分支的顶端,因此例如在顶部添加新提交是没有意义的)。

    【讨论】:

    • 我的愿景是,在生产服务器上更新站点的例程不应该关心过去是否有恢复。因此,从进一步更新的角度来看,如果没有恢复,将本地存储库恢复到类似于git fetchgit merge 之间的状态是完全可以的。
    • @alik 正如@vonbrand 指出的那样,“附加到同一个分支”不仅没有意义,而且“从分支中分离 repo 工作副本”也不正确,分支仍然指向到相应的提交。此外,您打算从远程仓库恢复,因此没有“介于”git fetch 和其他任何东西之间的状态,该状态是恰好在获取之后的状态,并且由您的远程跟踪分支集进行描述。跨度>
    • 我很抱歉不正确,因为我不是很喜欢 git。我试图在我的理解允许的范围内尽可能清楚地解释我的目标。 “Between”指的是 git pull,它与 git fetch 后跟 git merge 的作用相同,并带有正确的参数。
    • @alik,如果您对存储库本身不感兴趣(即历史记录、能够提交,...),您所需要的只是打包工作区中的文件,然后可能包含一个标签(或特定提交的哈希)以便能够恢复它。如果需要,例如先发布 r10,然后发布 r11,您可以转到 git diff r10 r11 并获取一个补丁来更新工作区,而无需您在生产中拥有存储库。
    【解决方案2】:

    我知道 git checkout hash 命令。不幸的是,此命令将存储库的工作副本与分支分离

    您可以获取分支并将其指向提交,承认您在问题主题中询问的“分支附件”:

    $ git update-ref refs/heads/<branch> <hash>
    

    【讨论】:

    • update-ref 将如何影响源副本和/或从源中提取更多更新?请在 vonbrad 提出我愿意实现的目标后查看我的评论。
    • @alik 我已经引用了我打算在回复中解决的部分,我打算给你一个额外的工具来使用,严格来说,仅此而已。现在,您可以在备份存储库中恢复特定修订,并将其命名为分支。除此之外,对远程分支应该没有影响,当然,只要 是本地(跟踪)分支。
    • 谢谢。我需要更深入地检查 update-ref 命令。第一次浏览手册是不够的。
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多