繁体   English   中英

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

[英]Recover unreferenced commits from remote git repository

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

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

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

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

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

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

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

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

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

.zip和.tar.gz都有效。

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

问题是您的本地存储库没有该提交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

不幸的是,这些都不奏效。 根据这个答案 ,似乎#2曾经用于Git v1.4。 截至目前,它已不再适用。

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

我可以想到两个选择:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM