Git状态显示致命错误:bad object HEAD

118

我在Windows Azure上使用Git时遇到了问题。Git status显示“fatal:bad object HEAD”,我尝试运行:

 git fsck --full
 git gc

但是 git fsck 显示:

broken link from  commit 739df633f185ce5d1ab7eb97d619b28e7d81185a
              to    tree 2a6d4876d135c1fa7cbe1348c62570006e895fc5
broken link from  commit 9c7eae5ffed34dbfac977e515dee675626b59f93
              to    tree 400132d215ab9aced883a9971e648b82624b2032
broken link from  commit 9c7eae5ffed34dbfac977e515dee675626b59f93
              to  commit 4a49af0a0cb64a0a0415734b11772d6df18561fb
broken link from  commit bc3072f30e71c616a8196089e19a67a2c9c0a5ad
              to    tree 0aa813c183487d0a1b1f7ae81501ca7a1168283f
broken link from  commit d3bb4f8545e91ec8ace15ad31a3147d92a1d4242
              to    tree 4682108accd8e72fe68858232386dffe60f9f02d
broken link from  commit 6b34795c4b54286301bcdc0ed254a04c132cb2ad
              to    tree 5c57dd3222d11924dba841d3cae517bdc9220601
broken link from  commit d70172d855391b93bc1c5eeb9b4226df525dfc6e
              to  commit 390c8cbd527c8e707c51e25142e54421f4dd3948
broken link from  commit cc05e8d2e3733693ebb67d697ae4b65e51fea79a
              to  commit 32f081f8b901425fd1e8898478f0551970bee0f5
broken link from    tree 6a75ed6d0311d800078e77f43d427d128372d5bc
              to    blob 4a064d610c0e7207967d59934c8bc5f491f26dae
broken link from    tree 6a75ed6d0311d800078e77f43d427d128372d5bc
              to    tree 5c06ec964dcbade49287d0f36efe1f7b60f446e3
broken link from    tree b4855fa6734b5652a93a9b799eafe47fad0d13a0
              to    blob 3e1fb421613dc9066cbf9c95eddc61619a9f8eed
broken link from    tree b4855fa6734b5652a93a9b799eafe47fad0d13a0
              to    tree 556a50048d42346c283c94b78ea278ba1d57d251
broken link from    tree 289c03409370c4ca7c12266ce2822a2976bd032b
              to    blob 3abf3c48ada45f63404dcf4d675ddfdadcfa83c6
broken link from    tree 289c03409370c4ca7c12266ce2822a2976bd032b
              to    blob 3fa569892003b468ed1301426dd6d96d9644be3c
broken link from    tree 289c03409370c4ca7c12266ce2822a2976bd032b
              to    blob 0a9a54a51e84f3bc34122dbce1146d895fcbe22c
broken link from    tree 289c03409370c4ca7c12266ce2822a2976bd032b
              to    blob 3fa48873564361b4d95830803ae77f79eeafaf5b

git branch 显示 -* master


1
看起来存储库在文件系统级别上已经损坏。要恢复HEAD,您需要向.git/HEAD写入一些有意义的内容,例如739df633f185ce5d1ab7eb97d619b28e7d81185aref: refs/heads/master(如果master分支没有问题)。但是这不太可能修复存储库。 - Vi.
我认为 HEAD 本身并没有损坏,而是它最终指向的东西出了问题。 - Ikke
我曾经遇到过同样的错误 - 但是 git fsck 已经为我修复了它。谢谢。 - tbrodbeck
当我使用diff创建补丁文件时,忘记忽略.git目录,导致出现了这种情况。 - chovy
22个回答

101

尝试这个; 它对我有用(警告:这会破坏仅存在于本地存储库中的工作):

rm -rf .git

如果您不想丢失贮藏的提交,可以使用mv替代rm

然后从其他clone复制.git

cp <pathofotherrepository>/.git . -r

然后执行

git init

这应该解决您的问题,祝您好运


我一直在寻找一个棘手的Git命令,但最终发现这个命令足够快速和干净。 - Y-B Cause
5
它有效!谢谢!但是有一个警告...你将会失去所有不在你的工作目录中的东西(本地分支,存储等)。也许你想使用mv而不是rm -rf来尝试稍后恢复一些东西;-) - Fernando Almeida
1
在我看来,这应该是被接受的答案。虽然Ikke提供了非常好的信息,但这是dotnetrocks正在寻找的修复方法... - Michael P
6
你是否意识到使用 rm -rf .git 命令会导致你丢失所有尚未推送到远程仓库的暂存和分支信息。请注意不要改变原意,保持通俗易懂。 - Jan
我刚刚在迁移到新电脑后遇到了这个问题。我只是从Github上执行了pull操作(尽管没有需要拉取的内容),然后进行了commit/push操作,使用的是sourcetree - Boppity Bop
显示剩余3条评论

64

这是因为我错误地删除了一些GIT的核心文件。尝试以下方法,对我很有效。

重新初始化git

git init

从远程获取数据

git fetch

现在通过以下命令检查您所有的更改和git状态:

git status

git status

1
当我遇到段错误时,我不得不升级git(homebrew)。在执行git fetch之后,我必须执行git pull以快进(它显示我的树落后于HEAD),然后才能使用git status查看有用的信息。 - kakyo
由于某些问题,我不得不卸载并重新安装 Git GUI。之后,SourceTree 停止工作了。这个解决方案对我起了作用。 - PalakM

62

你的代码库已经损坏,这意味着数据已经丢失,git本身无法恢复。如果你有另一个克隆的代码库,可以从中恢复对象,或者重新克隆。

fatal: bad object HEAD 表示HEAD引用的分支指向一个错误的提交对象,这可能意味着它丢失或损坏。

git fsck 输出中,你可以看到一些树、blob和提交对象丢失。

请注意,使用git本身并不能保证数据的安全性。在出现损坏时,仍需要进行数据备份。


4
这对我有用,我将代码库克隆到另一个目录,然后只需删除受损的.git文件夹,并用克隆的.git文件夹替换它。然后运行git init, git fetch和git status会自动检测最后未提交的更改。 - Reint

38

运行中

git remote set-head origin --auto

随后是

git gc

13
жІЎй”ҷпјҒжҲ‘зҡ„иө·жәҗеҲҶж”Ҝе·Ід»Һ master ж”№еҗҚдёә mainгҖӮиҝҷдёӘзӯ”жЎҲи§ЈеҶідәҶй—®йўҳгҖӮ - Iain Ballard
2
在我的情况下,添加 git fetch,然后 git merge origin/HEAD,最后 git push 就可以了。 - thebtm
这对我有帮助,而且不需要执行高评分答案中建议的破坏性操作!干得好。 - q0rban

34

在我的情况下,这个错误突然出现了,但是它不让我推送到远程分支。

git fetch origin

问题得到解决。

我同意这个方法可能不适用于每个人,但在尝试更复杂的方法之前,请尝试这个方法,没有什么损失。


5
在两台电脑之间部分同步文件后,我经常会遇到这个错误。对我来说,每次都可以通过以下方法修复。 - Lionel Henry
我也很困惑和烦恼文件同步的工作原理,我在使用Dropbox和Megasync时遇到过类似的问题。这个 .git 目录应该与两个节点同步。在 client1 上运行 du -s .git 的结果是 4.2M,而在 client2 上是 3.8M。我不知道为什么或者如何同步客户端设法跳过 .git 目录中的文件... - glen
我经常遇到这个问题。我无法确定为什么会发生这种情况。但是这个答案挽救了我的一天。谢谢。 - Biswajit Biswas

19

你的代码库出现问题。不过你可以修复它并保留你的编辑:

  1. 首先备份: cp your_repository your_repositry_bak
  2. 克隆损坏的代码库(仍然有效): git clone your_repository your_repository_clone
  3. 用克隆的 .git 文件夹替换损坏的文件夹: rm -rf your_repository/.git && cp your_repository_clone/.git your_repository/ -r
  4. 如果一切正常,删除克隆和备份: rm -r your_repository_*

5
这个答案将@serup的回答@ganesh的回答的优点结合在一起。 - jan-glx
1
如果你现有的代码库出了问题,最好的解决方法是使用以下方法!但要小心,这将不幸地删除你的存储。尽管如此,它可以修复代码库的头部! - sanpat

12

我曾遇到过类似问题,解决方法是从原始代码库中创建一个新的克隆副本。


2
我在使用VS2017(15.3.3)和git时,遇到了Windows 10崩溃的问题,最终来到了这里。由于没有任何未决的更改,所以根据@serup上面的答案,我做了以下操作:
  • 删除了包含.git作为子文件夹的根解决方案文件夹"C:\Code\MySolution"。
  • 然后从VSTS | Project=MySolution | Code | master分支页面,点击了"Clone"按钮,并选择了"Clone in Visual Studio"
  • 我输入了相同的位置"C:\Code\MySolution"。
最终一切都变得非常简单。
- Peter
这意味着你失去了本地分支,是吗? - Bernhard Döbler

4

当git文件损坏时,我成功地解决了类似的问题:

https://dev59.com/Onvaa4cB1Zd3GeqPBlLi#30871926

在那个问题的我的答案中,请查找我与此处相同的错误消息的部分:

fatal: bad object HEAD.

你可以尝试从那个时间点开始跟着我做。确保先备份整个文件夹。

当然,你的代码库可能以一种完全不同的方式受损,而我的方法并不能解决你的问题。但这可能会给你一些启示!Git内部机制看起来像魔法,但它实际上只是一堆文件,可以像其他文件一样进行编辑、移动、删除。一旦你对它们的功能和相互关系有了很好的理解,你就有很大的成功机会。


3
在我的情况下,这是由于糟糕的提交对象引起的。
例如:
ubuntu@server41:~/proj31$ git status -s | grep M
fatal: bad object HEAD

我不得不将新克隆的git目录从另一个目录(相同的仓库)复制到出现问题的git仓库中。(见下文)

ubuntu@server41:~/proj31$ cd ..
ubuntu@server41:~$ mkdir newr
ubuntu@server41:~$ cd newr
ubuntu@server41:~/newr$ git clone https://github.com/account434/proj31.git
ubuntu@server41:~/newr$ cd
ubuntu@server41:~/newr$ cd proj31

# copy .git directory from newly clone(same repo) to the one which has this problem.

ubuntu@server41:~/proj31$ cp -r ../newr/proj31/.git .

它有效了。


2

我通过执行git fetch命令解决了这个问题。我的错误是因为我将文件从Windows 10的主存储移动到了辅助存储。


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