情况如下:一些提交已在远程存储库中完成。
不幸的是,有人这样做了
push -f
,使得远程分支不再引用这些提交。
更糟糕的是,我的本地克隆中没有这些提交。
我的目标基本上是恢复这些提交。这些是我尝试过的一些事情:
git checkout -b recovery <commit_id>
:致命:引用不是树git push origin <commit_id>:recovery
错误:refs/heads/recovery 未指向有效对象!错误: 无法推送到不合格的目的地:recovery 目的地 refspec 既不匹配遥控器上的现有引用,也不以以下开头 refs/,我们无法根据源 ref 猜测前缀。
问题是您的本地存储库没有该提交 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 上有一个帮助页面,但没有您可以使用的答案:它基本上说,如果您在本地有提交,您可以从中创建一个分支并推送它。是的,但是如果你没有本地提交怎么办?它没有回答这个问题。
我可以想到两个选择:
git log SHA1
很容易检查。如果有人拥有它,他们可以使用 git branch recovery SHA1
从它创建一个分支,然后推送它。recovery
分支。如果您有提交的哈希值,那么您可以使用如下链接从 bitbucket 下载源树:
https://bitbucket.org/ownerName/repositoryName/get/A0B1C2D.zip
.zip 和 .tar.gz 都可以。
这并不能准确恢复提交,但至少您不会丢失源代码更改。我用它来简单地创建另一个具有相同更改的提交。
有一个小技巧 - 你说你已经在网络界面中打开了提交。 我的 Stash 版本能够在此提交上创建标签。寻找“没有标签[+]”
在 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