从远程git存储库中恢复未引用的提交

时间:2014-02-23 00:41:11

标签: git branch commit recovery

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

不幸的是,有人做了push -f,因此没有远程分支引用这些提交。

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

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

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

      

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

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

3 个答案:

答案 0 :(得分:3)

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

  public class MyClass {
    // class itself can modify m_MyList 
    private IList<int> m_MyList = new List{1, 2, 3};

    ...
    // ... while code outside can't  
    public IReadOnlyList<int> MyList {
      get {
        return m_MyList; 
      }
    }  
  }

.zip和.tar.gz都可以。

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

答案 1 :(得分:1)

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

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

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

我认为答案只是在本地获取丢失的提交,其中一种方式是:

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

不幸的是,这些都不起作用。根据{{​​3}},似乎#2用于Git v1.4。截至目前,它已不再适用。

有一个this answer,但没有你可以使用的答案:它基本上说如果你在本地提交你可以从它创建一个分支并推送它。是的,但是如果你没有本地提交那么呢?它没有回答这个问题。

我可以想到两个选择:

  1. 找到有此提交的队友。使用git log SHA1可以轻松查看。如果有人拥有它,他们可以使用git branch recovery SHA1从中创建一个分支,然后推送它。
  2. 联系bitbucket支持。由于他们在某处有提交,因此他们应该能够为您创建recovery分支。

答案 2 :(得分:0)

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