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

mic*_*el9 6 git branch recovery commit

这是情况:一些提交已在远程存储库中完成.

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

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

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

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

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

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

Sto*_*ica 4

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

git checkout -b recovery <commit_id>
git push origin <commit_id>:recovery
Run Code Online (Sandbox Code Playgroud)

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

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

git fetch origin         #1
git fetch origin SHA1    #2
git fetch origin SHA1:refs/remotes/origin/recovery  #3
Run Code Online (Sandbox Code Playgroud)

不幸的是这些都不起作用。根据这个答案, #2 似乎从 Git v1.4 开始就可以工作。到目前为止,它不再起作用了。

GitHub 上有一个关于此问题的帮助页面,但没有您可以使用的答案:它基本上说,如果您在本地有提交,您可以从中创建一个分支并推送它。是的,但是如果你没有本地提交怎么办?它没有回答这个问题。

我可以想到两个选择:

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