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

问题描述 投票:0回答:4

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

不幸的是,有人这样做了

push -f
,使得远程分支不再引用这些提交。

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

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

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

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

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

git branch commit recovery
4个回答
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

不幸的是这些都不起作用。根据这个答案,#2 似乎从 Git v1.4 开始就可以工作。现在已经不行了。

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

我可以想到两个选择:

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

3
投票

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

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

.zip 和 .tar.gz 都可以。

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


1
投票

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


0
投票

在 github 上过早删除分支并且本地没有提交后必须执行此操作。

我能够在 CI/CD 工具中找到感兴趣的提交,并且通过 SHA256 能够通过curl 使用 github API:

curl -L \
  -X POST \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-TOKEN>" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/git/refs \
  -d '{"ref":"refs/heads/featureA","sha":"aa218f56b14c9653891f9e74264a383fa43fefbd"}'

立即工作,

featureA
已创建。

有关其他 API 选项,您可以查看此页面:https://docs.github.com/en/rest/git/refs?apiVersion=2022-11-28#create-a-reference

© www.soinside.com 2019 - 2024. All rights reserved.