Git损坏的主分支


9

我在Windows 7上使用gitExtensions打开Visual Studio项目的Git存储库。它突然是空的。该存储库存在,但是我所有的提交都消失了。

我使用的是图形界面,我相信这是自他们更新以来,我第一次打开它。

我不确定如何取回我的提交。

当我打字

git log 

我收到

严重的:严重的默认版本'HEAD'

更新
查看/programming/1545407/recovering-broken-git-repository后,我尝试了

git fsck

它返回:

错误:无效的HEAD
致命错误:松散的对象36b7d9e1ca496bcb864c0b9c8671fcec97fbda31(存储在.git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671fcec97fbda31)

承诺退货:

错误:无法解析引用HEAD:没有此类文件或目录
致命:无法锁定HEAD ref

和记录主分支返回

$ git log master警告:忽略损坏的ref refs / heads / master。警告:忽略损坏的裁判ref / heads / master。致命:参数'master'含糊不清:未知修订或路径不在工作树中。使用“-”将路径与修订分开

我只会继续粘贴可能相关的东西

$ git reflog master
警告:忽略损坏的ref refs / heads / master。
警告:忽略损坏的裁判ref / heads / master。
致命:参数'master'含糊不清:未知修订或路径不在工作树中。
使用“-”将路径与修订分开

更有用的信息:每次删除损坏的文件时,都会替换一个。我开始认为这与主分支指向错误的事物有关。因为我认为脑袋指向主人。

一天后:
所以我找到了我的伴侣,他可以浏览日志,他说日志中的哈希值与文件夹中的对象不匹配。他尝试将master分支重置为日志或类似的内容,我有点迷失了。希望那有帮助



1
@heavyd,请检查更新
MrJD 2012年

Answers:


3

该存储库存在,但是我所有的提交都消失了。

你到底什么意思?工作树还在吗?是否.git/存在?里面有文件吗?

您发布的消息表明该文件.git/HEAD不存在。它定义了工作树的预期状态(已签出的状态)。如果该文件不存在,git不会知道您在哪里。

您可以尝试自己创建包含以下内容的文件: ref: refs/heads/master

如果您在其他分支上,只需用分支名称替换“ master”。如果您不在分支机构,那将更加复杂。

.git/logs/HEAD记录HEAD的过去状态,并在底部显示以后的行。此示例行显示了结帐: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 1346938344 +0200 checkout: moving from master to MySuperBranch

前面的SHA1引用提交。例如,您应该能够在分支日志中找到这些.git/logs/refs/heads/master

您提供的git reflog输出看起来refs/heads/master也丢失了。它唯一的内容应该是对它的最新提交(和换行符)的SHA1。您可以在分支日志的末尾找到最新的SHA1,例如.git/logs/refs/heads/master


2

如果.git / HEAD存在,ref: refs/heads/master然后检查其内容refs / heads / master,则该文件必须包含最后一次提交的sha1。

如果该文件已损坏且充满NULL字符,请编辑该文件,并将最新提交的sha1 .git/logs/HEAD或最后提交的sha1放在最后。

然后做 git reset --hard 'sha1 of the commit that you selected'


它确实充满了NULL字符,所以我放入了前一个提交的sha1,但随后进行git reset导致“错误:ref'HEAD'的update_ref失败:无法锁定ref'HEAD':无法解析参考HEAD:无效参数“
惊人的2013年

1

听起来您的存储库已损坏。最简单的方法是从备份中恢复您的存储库,或者从原始源重新克隆该存储库(假设您在存储库中没有大量工作)。

如果无法重新挂载/克隆,我建议您通读Pro Git(免费的在线书籍或纸质版本)。整本书内容非常丰富,但是特别要看最后一章,以了解Git在内部的工作方式。了解Git的工作原理后,请查看Linus 关于恢复损坏的对象的说明


因此,可悲的是我没有备份隐藏文件,.git被隐藏了。我真的没有足够的时间阅读整本书,您认为我可以尝试什么?
MrJD

“读一本有关内部的书”可能是不错的一般建议,但它无助于解决眼前的具体问题。
Burhan Ali

0

在网上浏览了一段时间后,我终于找到了它,并且可以正常工作。

git fetch origin
git reset --hard origin/master

这会带来任何更改origin(希望在本地不会做太多工作),然后强制本地master分支与远程服务器达成一致。小心,--reset意味着丢弃任何本地更改!此外,如果它还不是损坏,git reset origin/master那就可以恢复master分支的最后一个已知(签入)状态。
vonbrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.