Git提交记录丢失,不确定如何恢复

5

在我的硬盘损坏后,我试图恢复我的代码库并确保它们正常,但似乎已经发生了损坏,我直到现在才注意到这个问题。

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

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

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

我在主驱动器上备份的副本也遇到了完全相同的问题,没有提交(直到我做出第一次初始提交)和历史记录,但所有代码仍然完好无损。

涉及到的存储库在这里

我已经到处搜索相关话题却毫无结果,似乎这个问题相当罕见。

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

当前我的存储库中只有3个提交,通常应该有40-60个提交。

我的驱动器受到损坏,我不得不将所有东西转移到其他地方,包括一些受损的代码库。也许其中一些受损更严重,或者我做了一些导致它们被删除或无效的事情,我不知道,但今天我想要处理我的代码库时,我发现所有的更改都在等待提交,于是我提交了,不知道我的代码库已经不存在提交记录,或者我之前做了什么。我仍然不知道为什么,因为我确信之前已经验证过这个代码库没问题,但无论如何,这个代码库的变更(3次提交)现在存在于GitHub上,而不是应该有的30-40次提交。我想回到提交和推送这些更改到GitHub之前的状态,我知道这应该是可能的,因为我认为GitHub可以并且应该存储这样的更改,而且很难犯这样的错误。

编辑2:我决定放弃,我的原始代码库的备份无法恢复...

missing objects

也许通过一些神奇的git操作,你可以恢复我的一半提交记录,因为我知道它们还在那里,因为其中一半会显示这里...。 我已经向Git支持发送了电子邮件,并希望得到回复,看看他们是否能做些什么,但实际上这很不可能。最终没有真正有价值的东西丢失了,大部分是我想要回来的提交历史记录,这很糟糕,但我想我将不得不决定从此不再让这种事情发生(之前我使用的是便携式硬盘,掉落导致损坏。不能处理这种随机损坏的安装和存储库最容易受到攻击,我有一个便携式SSD,并将研究适当的RAID备份和存储以及更好地理解我对repos正在做什么)。 编辑3: 我想我应该在很久之后更新一下,以防有人遇到和我一样的情况:我从未修复过这个问题。但是幸运的是,GitHub向我提供了一个链接,其中包含所有我的提交的仍然可用版本。我有兴趣看看如何合并我的两个历史记录,但是我可能会恢复然后从现在开始复制我的东西,因为我在这段时间内没有在存储库上做太多工作。

无论如何,GitHub支持非常缓慢-一个月过去了他们才回复,而我只是在寻找完全不同的东西时注意到了这封电子邮件。他们能回复还是挺好的,但要小心可能不会得到及时的回复。


如果存储库在网上可用(在GitHub上),并且您已经推送了所有更改,则不会丢失任何内容。只需将存储库克隆到本地文件系统上的新目录中,就可以了。 - knittl
我克隆了代码库,但没有看到以前的任何提交记录。如下所述,“git reflog”也没有显示以前的几十个提交记录。该代码库在线上是存在的,但好像提交历史被覆盖了。 - Xevion
我查看了在线代码库。历史记录仍然存在,尽管提交信息是 - 看起来它并没有损坏(你在本地代码库消失之前进行了推送,对吧?),但一直以来就是这样的。你期望代码库有多少次提交(目前有3次)? - knittl
最近的操作是根据Michael在下面的回答/评论中的指示。 - Xevion
git fsck 还会告诉你有关“悬空”对象的信息,这些对象不再从你的头部(即分支或标签)可达。如果你发现任何悬空的提交,请使用 git loggitk 进行检查。也许你仍然可以找到你的历史记录。 - knittl
显示剩余4条评论
2个回答

3
你尝试过使用git reflog命令吗?它可以给你已删除的提交历史记录,然后你可以获取SHA并再次使用它。"最初的回答"

我在克隆的存储库、备份存储库和主存储库上输入了命令,它们都只显示我最近提交的提交记录,而没有丢失的提交记录。 - Xevion
所以只需获取最新的提交SHA并执行 git reset <latestCommitSHA>,即可将您的历史记录恢复到那个时间点,即使由于某种原因它已被删除。 - Michael
据我所知,这并没有做任何事情,并且考虑到命令的性质,它也不会做任何事情... - Xevion
不太确定这是否可能,但请尝试上面建议的方法,从存储库中拉取到未损坏的提交,然后强制推送。https://serverfault.com/questions/117255/git-pull-specific-revision-from-remote-repository - Michael
我不知道有没有未损坏的提交,我的 Chrome 历史记录中也没有任何提交,而且在 URL 或类似的地方也找不到任何提交。 我也不知道哪里可以找到。 - Xevion
显示剩余6条评论

1
如果您将提交推送到GitHub,则可以使用GitHub API 在几个步骤中恢复历史并合并丢失的提交:
1. 转到此网址:https://api.github.com/repos/<user>/<repo>/events 2. 这将返回/显示一个JSON对象,您可以使用CTRL + F搜索丢失的提交并输入提交消息或可能的作者。 3. 复制提交的完整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

字段:

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

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

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

  • <repo>:仓库名称。

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

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

  2. 从那里,您可以将提交选择或合并回主分支。

源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接