101

我的电脑死机了,现在我的一个 git 存储库坏了。当我尝试结帐大师时,它告诉我:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

当我执行时,git stash我得到:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

那么……我该怎么办?

更新 输出git reflog

fatal: bad default revision 'HEAD'

不是很有希望...输出git fsck

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt
4

19 回答 19

181

我设法通过以下方式恢复:

rm .git/refs/remotes/origin/HEAD
git fetch --all
于 2016-03-10T04:47:35.777 回答
26

按照恢复损坏的 git 存储库中建议的步骤开始:

  • 检查是否.git/refs仍然包含任何有用的东西
  • 检查git reflog并失败.git/logs/refs/heads/master您最后所在的分支的内容或任何分支
  • 运行git fsck,可能与--unreachable--lost-found

这有望让您弄清楚masterref 应该是什么,以便您可以恢复它(即,将正确的 SHA1 放入.git/refs/heads/master)。

如果该提交中包含的任何对象真正损坏,您将无法恢复您的HEAD提交。假设您的工作树和/或索引完好无损,您可以尝试 a git reset --soft(或失败 a git reset)到上一次提交,然后重新提交。避免任何改变你的工作树 sagit checkout -fgit reset --hard.

于 2013-03-09T23:39:07.303 回答
13

在 Windows 8.1 蓝屏死机后,我遇到了类似的问题

我在这个位置有一个文件...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

它是空的,而这个文件夹中的其他分支文件里面有很长的字符串。

注意我没有任何更改/提交

  • 我备份了<problem-branch>文件
  • 删除了文件
  • git fetch --all再次获得分支

然后选项卡自动完成再次开始工作

于 2015-11-04T10:18:49.960 回答
6

如果修改的文件不多,我认为解决这个问题的方便方法是:

  1. 备份您在 repo 中修改的文件
  2. 删除您现有的回购
  3. 从服务器重新克隆它
  4. 将步骤 1 中的文件粘贴到 repo,然后git commit -a
于 2013-03-10T10:55:18.740 回答
5

在计算冻结和崩溃后,我的 git 分支被以下消息损坏: git fatal: your current branch appears to be broken. 我什么也做不了。

之后git fsck提到该分支有一个error: Invalid HEAD. refs/heads/<branch>有一个invalid sha1 pointer

按照此处的选项,我.git/refs/heads/<branch>在记事本++ 编辑器中打开,每个 sha1 字符都是NUL.

幸运的是,我只需要将分支重置为远程状态,那是在 bitbucket 存储库中。我从远程仓库的尖端抓取了 sha1 并将其复制到.git/refs/heads/<branch>保存的位置,然后执行了git reset --hard HEAD,一切恢复正常。

于 2017-10-04T14:16:08.590 回答
5

我设法通过删除 git\refs\heads 目录中的主文件来解决这个问题

于 2018-03-18T15:02:35.680 回答
3

由于无法锁定参考错误,我无法签出我的主分支。我最终删除了: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

并调用这个 git 命令:

git fetch --all
于 2017-07-19T00:16:16.147 回答
2

我太白痴了,忘了推送,我的电脑在执行提交时崩溃了。我可以通过打开 .git/logs/refs/heads/ 来恢复除最后一次提交之外的所有内容

该文件包含对分支的所有提交(及其 SHA),我所做的恢复是:

  • 将最新更改备份到临时文件夹
  • 改用“白板”
    • git checkout master
    • git reset --hard
  • 签出日志中倒数第二个提交
  • 从这个分离的头创建一个分支
  • 恢复最新更改
  • 再次提交

所以即使你犯了一个愚蠢的错误,你也不会立即被一整天的 git 工作所吸引:)

于 2016-08-03T08:59:54.587 回答
1

当 Android Studio 突然终止时(由于计算机断电),我遇到了同样的问题。

我通过将文件的内容复制到我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\master文件来解决它C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\master

(以前,我也在 Android Studio 中打开了“强制推送”选项,但我认为这不是必要的步骤。)

笔记:

我通过将我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\目录(包括子目录)中文件的内容与另一个健康项目中的相应文件进行比较找到了这个解决方案 - 例如,C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

您可能有一个损坏的不同文件,但通过与另一个健康项目进行比较,您应该能够快速发现问题所在。

如果您没有另一个配置了 git 的健康项目,则可能值得以与创建损坏的项目相同的方式创建一个简单的项目,以便进行调查、比较和修复等。

PS - 我的错误信息(已编辑)是:warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

于 2016-07-07T12:16:45.347 回答
1

我的电脑崩溃了两次,结果我的 git 存储库在本地被破坏了。我无法拉动我的更改,它要求设置远程来源,但它在 gitKraken 中不起作用。

在我的命令提示符下,我收到了这个错误 在此处输入图像描述

我知道我的参考资料已损坏,需要修复。我必须做的是 git bash (在 SourceTree 点击“终端”)。然后像这样导航到引用文件夹

cd .git
cd refs
cd remotes
cd origin

那里会有一个文件名master,用于ls查看目录中的内容。然后只需使用 rm master 删除它

bam,损坏的文件不见了。现在如果你发出 git branch 命令 -a,它会输出这个

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

然后发出这个命令,它会修复你的引用

$ git remote set-head origin master

总而言之,如果您尝试拉遥控器,它应该显示已修复的空白遥控器名称。

在此处输入图像描述

于 2019-02-20T07:56:46.067 回答
1

我知道这是一个为时已晚的响应,但我收到了这个错误,因为我没有origin/head. 你可以通过运行找到这个git branch -r。如果你没有看到你origin/head指向一个远程源,你可以通过运行来设置它git remote set-head origin {{your branch name}}

现在git branch -r再次运行,您应该会看到如下内容: origin/HEAD -> origin/develop

我希望这对遇到此问题的其他人有所帮助。

于 2017-06-13T18:39:20.033 回答
0

检查 MSWindows 是否创建了包含 git 的 desktop.ini 文件?它对我有用。一旦我将它们全部删除到 .git 目录的子文件夹中,它就可以工作了。

于 2016-06-05T14:02:16.367 回答
0

如果我会在某人之后重复(我还没有阅读所有反馈),请原谅我。在我看来,解决问题的最简单方法是复制没有 .git 和 .idea 的项目,清理它,从 git 克隆,删除除上述目录之外的所有内容,然后将以前的副本粘贴到新创建的带有 .git 和 .idea 的仓库中. 希望它确实有意义。

于 2018-07-17T14:13:52.670 回答
0

只需添加我的案例:

git push

错误:无法锁定参考 'refs/heads/master':无法解析参考 'refs/heads/master':参考损坏

我试过了:

git clone <path>

但得到:

You appear to have cloned an empty repository.

我在服务器存储库上检查了这个文件:

裁判/负责人/大师

该文件有一个很长的空白字符字符串。

我用这个命令检查了最后一个提交标识符(幸运的是它仍然有效):

git log origin/master -5

然后我将最后一个提交标识符复制到服务器文件refs/heads/master

有风险,但它奏效了。克隆,推拉到现在都可以。

于 2021-02-04T21:13:54.610 回答
0

如果你记得你的头指向哪个分支,那么只需转到 github/bitbucket 上的那个分支并复制分支上最新提交的哈希并将其粘贴到文件 .git\refs\remotes\origin\HEAD 中,然后相同混帐添加。git commit -m "" git 推送

于 2021-02-11T16:36:32.823 回答
0

面临类似的问题(计算机紧急重启,可能是由于使用 Windows bugchecker re: KB4586853 从 Sourcetree 的内存泄漏/BSOD?)我从以下位置得到以下信息git fsck --full

error: refs/heads/merge/FEED-318: invalid sha1 pointer 0000000000000000000000000000000000000000
error: bad ref for .git/logs/HEAD
error: bad ref for .git/logs/refs/heads/<my-branch-name/with-subfolder>

不确定这是不是巧合,但我的分支被命名为merge/TICKET-NO.

在盲目地尝试了许多这些解决方案后,我找到了之前提交的 SHA(来自.git/logs/HEAD)并--force检查了它,问题基本解决了。我所有的历史都回来了,能够gitk看到漂亮的图表等。只丢失了最后一次尝试提交的更改。

于 2021-04-27T15:29:31.743 回答
0

我有同样的问题,但没有运气,无法找出问题所在。我把我的回购放在一边,从服务器重新克隆了一个,并试图在它们之间合并。当然,它显示了很多与我的分支无关的文件,但有助于隔离所需的文件。

于 2015-11-12T11:32:45.753 回答
0

详细说明

错误信息“断头”是什么意思?

在解决问题之前,我们应该先了解错误信息。

错误信息说 HEAD 坏了!哪个头?头部表示我们当前的分支。该错误基本上意味着 CURRENT BRANCH 已损坏。

假设我们有 , 之类的分支,ab当前分支是 分支。bbcbab

当我们运行这个命令ls .git/refs/heads时,我们会看到ab, bb, cb,它们是包含像392b55ccd3ba02fe236148c5264f8ef1da.

每当我们提交时,这个哈希值就会改变。

让我们回到错误消息“Head is broken”。

这实际上意味着这个分支的哈希值是无效的!

如何重新生成此错误(也许)?

第 1 步:在不提交的情况下进行大量更改。

第 2 步:提交重大更改后仅 1 秒关闭计算机。

所以,git 无法更新新的哈希值,现在旧的哈希值失效了!

怎么解决?

只需删除当前的哈希值!就这么简单!

ab是我们当前的分支,这是我们的断头!

rm .git/refs/heads/ab命令将删除包含 INVALID 哈希值的 ab 文件。

如果分支是远程分支(之前被推送到仓库),那么我们应该git pull --allow-unrelated-histories --ff origin ab

如果分支是本地的,则继续提交。

解决了!

于 2021-08-11T09:01:08.553 回答
0

因为我知道我的本地分支是最新的,所以一个快速的解决方法是简单地将头部 SHA-1 复制到远程


我的可能原因:电源故障。

我收到了这个错误,但无论如何我都能推送更改。

我检查了文件.git/refs/remotes/<branch>,它包含所有null字符。

但是,.git/refs/heads/<branch>具有正确的 SHA1。

于 2021-02-04T19:50:50.903 回答