从远程Git仓库恢复未引用的提交记录

8
这是情况:在远程存储库中进行了一些提交。
不幸的是,有人使用了push -f命令,导致没有远程分支引用这些提交了。
更糟糕的是,我在本地克隆中也没有这些提交。
我的目标基本上是恢复这些提交。以下是我尝试过的一些方法:
  • git checkout -b recovery <commit_id>:fatal: reference is not a tree
  • git push origin <commit_id>:recovery

错误:refs/heads/recovery不指向有效的对象!错误:无法将内容推送到未经限定的目标:recovery。目标refspec既不匹配远程现有的ref,也不以refs/开头,我们无法根据源ref猜测前缀。该存储库位于Bitbucket上,因此可以从Web界面访问提交,因此它尚未被垃圾回收。

3个回答

4
问题在于你的本地仓库没有那个提交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

很遗憾,这些方法都不起作用了。根据这个回答,似乎在 Git v1.4 时 #2 还有效。但是现在已经不行了。
GitHub上有一个帮助页面,但是没有你可以使用的答案:它基本上说如果您在本地拥有提交,那么您可以从中创建一个分支并将其推送。但是,如果您在本地没有提交怎么办?它没有回答这个问题。
我能想到两个选择:
  1. 找到一个有此提交的队友。使用 git log SHA1 很容易检查。如果有人拥有它,他们可以使用 git branch recovery SHA1 创建一个分支,然后将其推送。
  2. 联系 Bitbucket 支持。由于他们拥有提交记录,所以他们应该能够为您创建一个名为 recovery 的分支。

我刚刚成功地使用 Git 版本 2.28.0.windows.1 执行了 #2。 - sebrockm
#2 对我也起作用了,使用GitLab服务器。 - Louis Caron

3
如果您有提交的哈希值,则可以通过类似于以下链接的方式从Bitbucket下载源代码树:

如果您有提交的哈希值,则可以通过类似于以下链接的方式从Bitbucket下载源代码树:

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

无论是 .zip 还是 .tar.gz 都可以使用。

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


1

有一个小技巧 - 你说你已经在网页界面中打开了提交记录。 我的Stash版本可以在此提交记录上创建标签。请查找"无标签[+]"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接