Git 提交历史记录丢失并且不确定如何恢复

Xev*_*ion 5 git github

在我的硬盘损坏的灾难发生后,我试图恢复我的存储库并确保它们没问题,但似乎损坏已经发生,而且我现在才注意到损坏。

我的代码仍然完好无损,但我的历史,它已经不复存在了。

E:\Programming\exercism>git log --oneline
2c9cbb3 (HEAD -> master, origin/master) .gitignore clojure update
b5a05e1 ?
f2c891c ?
Run Code Online (Sandbox Code Playgroud)

?提交是我试图弄清楚发生了什么,当时我不知道我正在提交整个存储库......因为它不存在。我在 VS Code 中提交了这些更改)

我在一个主驱动器上的备份遇到了同样的问题,零提交(直到我进行第一次初始提交)并且没有历史记录,但所有代码仍然完好无损。

有问题的存储库在这里

我到处搜索手头的主题都无济于事,看来这个问题相当罕见。

编辑:对当前情况的进一步解释:

目前我的仓库中只存在 3 个提交,正常情况下应该有 40-60 个左右。

我的驱动器遭到损坏,我不得不转移其中的所有内容,包括存储库,其中一些存储库已损坏。也许其中一些造成了更多损坏,或者我做了一些最终删除或使它们无效的事情,我不知道,但今天我去处理我的存储库,我注意到一切都在等待提交,而我没有这样做知道我的存储库提交不再存在,或者也许我事先做了一些事情。我仍然不知道为什么,因为我确信我事先已经验证了这个存储库没问题,但无论如何,存储库发生了变化,3 个提交现在存在于 GitHub 上,其中应该有超过 30-40 个提交。我想回到我提交并将这些更改推送到 GitHub 之前,我知道这应该是可能的,因为我觉得 GitHub 可以而且应该存储这样的更改,而且应该很难犯这样的错误

编辑2:我决定放弃,我的原始存储库副本无法恢复......

丢失物体

也许通过一堆 git 魔法,你可以恢复我一半的提交,我知道它们在那里,因为其中一半出现在这里......

我已经给 Git 支持人员发了电子邮件,希望能得到回复,看看他们是否能做点什么,但老实说,目前还不太可能。最终没有丢失任何真正有价值的东西,这主要是我想要找回的提交历史记录,这很糟糕,但我想我必须下定决心不再让这种情况再次发生(我之前使用的是便携式硬盘,并且放弃了)它会造成损坏。无法处理这种随机损坏的安装和存储库是最容易受到攻击的,我有一个便携式 SSD,我将研究此类内容的适当 RAID 备份和存储,以及更好的理解我正在用我的仓库做什么)。

编辑3:我想我会在很长一段时间后更新这个,以防万一有人遇到与我相同的情况:我从未修复过这个问题。但幸运的是,GitHub 确实为我提供了一个包含我所有提交的仍在运行的版本的链接。我有兴趣了解如何合并我的两个历史记录,但我可能会恢复然后复制我现在的内容,因为我同时还没有在存储库上做太多工作。

不管怎样,GitHub 支持非常慢——一个月过去了他们才回复,我只是在搜索完全不同的东西时才注意到这封电子邮件。他们能做出回应真是太好了,但我担心你可能无法得到方便的回应。

小智 1

如果您将提交推送到 GitHub,则可以使用 GitHub API 通过几个步骤恢复历史记录并合并丢失的提交:

  1. 转到这个网址:https://api.github.com/repos/<user>/<repo>/events

这将返回/显示一个 JSON 对象,您可以在其中使用 CTRL+F 搜索丢失的提交并输入提交消息或作者。

  1. 复制提交的完整 SHA 并将其粘贴到以下命令中:
$ curl -u <user>:<password> -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"ref":"refs/heads/recover-commits", "sha":"<full_commit_sha>"}' https://api.github.com/repos/<user>/<repo>/git/refs
Run Code Online (Sandbox Code Playgroud)

领域:

  • <user>:<password>:您的 GitHub 帐户的用户名和密码。

  • refs/heads/<branch-name>: 新分支的 ref,必须有两个斜杠并以“refs”开头。最后一个斜杠后面的是分支的名称

  • sha:提交的完整 sha,例如:“efdec9f65bf420b1af91ad1aded915a42c5fa34d”

  • <repo>: 存储库名称。

它将使用 GitHub API 发送请求来创建一个名为“recover-commits”的新分支,该分支指向该提交。

  1. 如果成功它应该返回类似这样的内容:HTTP/1.1 201 Created Server: GitHub.com ...

  2. 从那里您可以挑选或合并提交回您的主分支。

来源