Git中的分支出现错误,致命错误:你当前的分支似乎已经损坏。

74

这是我的情况:

  • 我在一个分支上工作。
  • 向远程推送了新的提交。
  • 切换回主分支。

但是,在键入git checkout master命令后,我的计算机突然遭遇了蓝屏死机,并发生了意外的强制关闭。重启计算机后,我检查了当前分支的状态,结果每个文件都被标记为新文件。

现在,我卡在这一点上,运行git log命令时出现错误。

$ git log
fatal: your current branch appears to be broken

如何解决这个问题并恢复我的分支?

我正在使用Windows 7和最新版本的Git Bash。

编辑:我不想删除这个分支。


文件 .git/HEAD 的内容是什么?它指向一个有效的分支名称吗?然后该分支名称是否指向一个有效的提交哈希值? - knittl
当我的电脑在进行 git push 的过程中关闭,并在重新打开后重新启动时,我遇到了这个问题。重新启动后,执行 git log 仍然出现了相同的错误。 - Olov
13个回答

92

我在 Windows 7 上遇到了类似的问题。在我的情况下,\.git\refs\heads 下当前分支文件(由 ./git/HEAD 引用)已经损坏。

我在 .git\logs\refs\heads 中找到了与同名分支的当前分支对应的哈希代码。

我通过用记事本打开那个文件 (.git\logs\refs\heads\xxx),将第四个数字(哈希代码)复制到 (.git\refs\heads\xxx) 文件中来解决了这个问题。


在我的情况下,.git文件夹被隐藏了,你可以自己看看。 - Prakhar Kulshreshtha
2
谢谢!我发现检查提交哈希值也很有用,以确定是否是我想要恢复的状态,使用 git checkout <hash>(在将其复制到 git/refs/heads/xxx 之前)。 - ph_0
3
谢谢,它起作用了。我从.git\logs\refs\heads\xxx复制了最后一次提交哈希到.git\refs\heads\xxx。日志中有两列哈希码,第二列的最后一个条目是我的最后一次提交。 - orchidrudra
2
谢谢,伙计。它起作用了。实际上,我只是从.git\logs\refs\heads\xxx的最后一行复制了第二个哈希码到.git\refs\heads\xxx。 - Randy Reiza
谢谢,对我也起作用了。为什么突然发生这种情况呢? - undefined
显示剩余4条评论

14

.git\refs\heads目录中的文件是您的分支。 检查这些文件。它们应该只包含一个提交对象SHA-1哈希值。这个哈希值是您最新提交的SHA-1密钥和您的HEAD。

复制SHA-1密钥并键入

$ git cat-file -t 5917fefd485f655ab369d4e9eeda3c157c03f514
commit

$ git cat-file -p 5917fefd485f655ab369d4e9eeda3c157c03f514
tree b75cab3c54b780075b312be3e878b389a2baf904
parent 8235189aa22169295243d295fb1cc2ff2f8f7cd5
author Ilker Cat <ilker.cat@blabla.com> 1495136738 +0200
committer Ilker Cat <ilker.cat@blabal.com> 1495136738 +0200

第二个输出基本上包含了提交对象的内容。请检查您的主分支下 .git\refs\heads\master 中的提交对象及其树和父级SHA-1密钥是否未受损。

即使是您主分支文件内的一些撇号也会导致“损坏的分支”。它必须仅包含最新的提交对象SHA-1哈希值,而不包括其他任何内容。


7

如果你试图将分支重命名为命名空间(或文件夹)分支,就可能会遇到这个错误。

如果出现这种情况,请前往目录.git/logs/refs/heads/<name>.git/refs/heads/<name>,你会看到你的分支现在变成了一个带有文件的文件夹。

在这两个文件夹中,将文件移动到该文件夹级别,检出该分支,删除现在为空的文件夹,然后你就可以执行 git checkout -b <name>/<subname>git branch -M <name>/<subname> 而不会出错。


1
无法感谢你够多。差点心脏病发作! - priteshbaviskar
3
我希望我能理解为什么它有效,但是它确实有效。(在拉取过程中我的电脑崩溃了,我没有试图重命名我的分支) - mushcraft

5

我通过将代码克隆到一个新文件夹并替换更改过的文件来解决了这个问题。这似乎不是一个好的解决方案,但它是安全的!


4

有时也可能由于文件权限问题导致此错误,请检查您是否对存储库下的所有文件具有适当的权限。


是的,但在这种情况下,我是唯一拥有所有权利的用户! - Suresh Karia

2

你现在的分支名称可能包含了一些特殊字符或其他类似的内容。

你应该进入你的检出根目录(也就是 .git/ 目录所在的位置)并且:

  1. 编辑 .git/packed-refs 文件;如果你看到一行包含你的分支名称,则删除它
  2. .git/refs/heads 目录中查找以你的分支命名的文件,如果找到了,则删除它

在执行此操作后,它似乎只将我的文件视为“所有文件都是新的”。\ - rogerdpack

2

我也遇到过同样的问题。 删除 .git\refs\heads\ 目录解决了我的问题。


2

在我的情况下,使用记事本打开位于 .git\logs\refs\heads\<MY-CORRUPTED-BRANCH> 的文件后发现为空。因此我将其删除。

然后运行以获取最新提交。

git reflog

4404dd7 HEAD@{0}: commit: 更新README文件

然后我运行了以下命令:

git reset --hard 4404dd7 

HEAD现在位于4404dd7更新README

并且分支已经回来了。 注意

这可能会使你的分支分叉。所以您可能需要稍后修复它们。

4404dd7是我在该分支中的最新提交,我不知道这是否是正确的解决方案,但这是对我有效的方法。


0

我也遇到了同样的问题,当我在提交操作仍在运行时关闭IDE时, 当我打开.git/refs/heads/branch-name文件时,发现文件是空的,所以如上所述,我从.git/logs/refs/branches/branch-name中复制了最后一次提交的哈希值,并将其粘贴到了空文件中,这解决了问题。


0

我曾经遇到过同样的问题。我只是删除了.git/refs/heads文件夹中的所有文件, 然后我尝试编辑其中一个文件,以便Git接受提交。然后,当我推送我的文件时,我得到了这个错误:

10:47 推送被拒绝 推送已取消,因为在更新期间存在冲突。 请检查冲突是否已正确解决,并再次调用推送。

然而,当我合并文件时,通过接受rebase选项来解决它,从而没有冲突。


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