【问题标题】:Recover unreferenced commits from remote git repository从远程 git 存储库中恢复未引用的提交
【发布时间】:2014-03-24 15:12:18
【问题描述】:

情况如下:一些提交已在远程存储库中完成。

不幸的是,有人做了push -f 使得远程分支不再引用这些提交。

更糟糕的是,我的本地克隆中没有这些提交。

我的目标基本上是恢复这些提交。这些是我尝试过的一些事情:

  • git checkout -b recovery <commit_id>:致命:引用不是一棵树
  • git push origin <commit_id>:recovery

    错误:refs/heads/recovery 未指向有效对象!错误: 无法推送到不合格的目的地:恢复目的地 refspec 既不匹配遥控器上的现有 ref 也不以 refs/,我们无法根据源 ref 猜测前缀。

存储库位于 bitbucket 上,并且可以从 Web 界面访问提交,因此它没有被垃圾收集。

【问题讨论】:

    标签: git branch commit recovery


    【解决方案1】:

    问题是您的本地存储库没有该提交 ID。

    git checkout -b recovery <commit_id>
    git push origin <commit_id>:recovery
    

    由于这个原因,这两个命令都失败了,如果我使用本地不存在的提交 ID,我会收到与 GitHub 存储库完全相同的消息。

    我认为答案只是通过以下方式之一在本地获取丢失的提交:

    git fetch origin         #1
    git fetch origin SHA1    #2
    git fetch origin SHA1:refs/remotes/origin/recovery  #3
    

    不幸的是,这些都不起作用。根据this answer,似乎#2 从 Git v1.4 开始工作。截至目前,它不再起作用了。

    有一个help page for this on GitHub,但没有你可以使用的答案:它基本上说如果你在本地有提交,你可以从中创建一个分支并推送它。是的,但是如果您在本地没有提交,那该怎么办?它没有回答。

    我能想到两个选择:

    1. 找一个有这个提交的队友。使用git log SHA1 很容易检查。如果有人拥有它,他们可以使用 git branch recovery SHA1 从它创建一个分支,然后推送它。
    2. 联系 bitbucket 支持。既然他们有提交,在某个地方,他们应该能够为您创建一个 recovery 分支。

    【讨论】:

    • 我刚刚使用 git 版本 2.28.0.windows.1 成功执行了 #2
    • #2 也为我工作,使用 gitlab 服务器
    【解决方案2】:

    如果你有提交的哈希,那么你可以从 bitbucket 下载源代码树,链接如下:

    https://bitbucket.org/ownerName/repositoryName/get/A0B1C2D.zip
    

    .zip 和 .tar.gz 都可以。

    这并不能完全恢复提交,但至少您不会丢失源代码更改。我用它来简单地创建另一个具有相同更改的提交。

    【讨论】:

      【解决方案3】:

      有一个小技巧 - 你说你已经在 web 界面中打开了提交。 我的 Stash 版本能够在此提交上创建标签。寻找“无标签 [+]”

      【讨论】:

        猜你喜欢
        • 2011-09-03
        • 2012-11-28
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 2017-05-28
        • 2012-05-09
        • 2013-09-30
        • 2012-01-03
        相关资源
        最近更新 更多