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

标签 git branch commit recovery

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

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

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

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

  • git checkout -b recovery <commit_id> : fatal: reference 不是一棵树
  • git push origin <commit_id>:recovery

    error: refs/heads/recovery does not point to a valid object! error: unable to push to unqualified destination: recovery The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref.

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

最佳答案

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

不幸的是,这些都不起作用。根据 this answer,#2 似乎从 Git v1.4 开始工作.截至目前,它不再起作用。

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

我可以想到两种选择:

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

关于git - 从远程 git 存储库中恢复未引用的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21962653/

相关文章:

git - 有没有办法在没有awk的情况下获取git中额外提交的数量?

java - 无法使用 Git Bash 运行 Java 应用程序

git - hg-git:删除远程分支?

Git 功能分支和次要代码改进

Git: merge 到master,然后推回到所有分支

workflow - Gerrit 工作流程 - 将单个提交推送到主题分支

java - CI/CD - 在发布分支、管道或源代码构建上标记 jar Artifact ?

git - 如果从 bitbucket 触发时它们发生了变化,我怎样才能让 Jenkins 只构建功能分支

eclipse - 尝试使用 Eclipse subversive 插件提交时获取 "CHECKOUT can only be performed on a version resource"

node.js - 将 commitlint 添加到 husky 中的 commit-msg 钩子(Hook)的正确方法是什么?