【问题标题】:Git Cannot lock ref 'HEAD'Git 无法锁定 ref 'HEAD'
【发布时间】:2020-01-16 13:57:16
【问题描述】:

我昨天做了一些提交,但没有推送它们。今天我醒来我试图推它,我有

错误:错误的索引文件 sha1 签名 致命:索引文件损坏

我尝试过:

$ del .git\index
$ git reset

然后再次尝试推送我的提交,但失败了,现在我有

致命:无法锁定 ref 'HEAD':无法解析参考 'refs/heads/light-mode':参考损坏

发生了什么事?我不想丢失我的提交,但更重要的是我不想丢失我对项目的本地更改。

【问题讨论】:

  • 没有关于这个 ref 'HEAD' 的信息。我删除了 .git/index 并运行 git reset 但我仍然收到错误我不知道该怎么做我认为我需要创建新的仓库并推送我的本地更改但我会丢失我的提交历史分支拉取请求等...
  • 这个stackoverflow.com/q/39057962/5784831怎么样?有一些很好的分析建议。也许这有帮助...

标签: git


【解决方案1】:

如果你在 linux 中做,你可以删除索引(如果你愿意,可以做一个备份副本),然后将索引恢复到上次提交的版本

rm -f .git/index

git 重置

【讨论】:

  • 你好。这正是我所做的,但在 Windows 机器上。请阅读我的问题。
  • git fsck --full
  • 拜托...如果我没记错的话,如果我运行 fsck,我可能会丢失本地更改
  • 如果您仍然遇到同样的错误,请备份并重置 git repo git reset --hard head git clean -f git pull git checkout branchname
【解决方案2】:

您的 Git 存储库已损坏。目前还不能说由什么由谁。一个常见的罪魁祸首是使用 Dropbox 或类似工具来存储 .git 目录。1一个不太常见的罪魁祸首是实际的硬件故障,例如,您的旋转生锈磁盘或 SSD 发生故障。

这条消息:

fatal: cannot lock ref 'HEAD': unable to resolve reference
'refs/heads/light-mode': reference broken

发生是因为您当前的分支 light-mode 的哈希 ID 存储在 .git/packed-refs.git/refs/heads/light-mode 中。这些文件中的一个或两个要么包含垃圾,要么不再包含有效提交的哈希 ID。同样,实际上不可能猜测哪些文件有哪些特定问题,也无法猜测是哪些程序或硬件故障导致了它们。您所做的工作可能已被损坏或毁坏,无法挽回。

如果您知道昨天提交的正确哈希 ID,您可以尝试使用 git checkout <em>hash</em> 来恢复该哈希 ID。如果一切都失败了,您可以运行 git fsck --lost-found:对于 Git 打印 dangling commitdangling blob 的每个哈希 ID,Git 也会保存 contents em> 将该提交或文件放入.git/fsck/lost-found:查看commitsother 文件夹。 other 文件夹将包含找到的文件的数据。这些文件的名称不再可用,但您可能会认出一些重要内容,因此可以说:啊哈,这就是我想要找回的重要文件并得到它往回走。


1总的来说,这是一个非常糟糕的主意,因为 Dropbox 和 Git 争夺谁将控制特定文件的特定内容。它可以工作一段时间,导致一种虚假的安全感。然后——通常是在重要的演讲或课程截止日期之前——boom,Dropbox 决定将六个关键的 Git 文件回滚到某个以前的版本,然后你的工作就消失了。

【讨论】:

  • 我不使用保管箱,我的 SSD 似乎工作正常,这很神秘
  • 你能说出为什么这个错误会自动发生吗?我什么都没做,昨天还在工作,现在没有了。
  • @BadriPaudel:不,它需要手动调查和/或情境知识(例如,“哦,昨天断电,系统必须重新启动并在这样做时吃了一些文件”或“管理员昨天将所有内容从一个磁盘驱动器移动到另一个”或其他)。
【解决方案3】:

我有类似的经历,对我来说,问题是我使用 Git Bash 以及内置的 Visual Studio Git 插件。

对他有用的是删除以下位置的分支文件 .git/refs/heads/branch_name

然后我回到 Git bash 并执行以下命令 git reset 就可以了。

我认为我的教训是,今后我将一直使用 Git Bash。

【讨论】:

  • 你的意思是如果你在IDE中使用集成终端而不是git bash,它可能会产生问题?
【解决方案4】:

试试这个

 git remote set-head origin --auto

为命名远程设置默认分支(即符号引用 refs/remotes//HEAD 的目标)。不需要远程的默认分支,但允许指定远程的名称来代替特定的分支。例如,如果 origin 的默认分支设置为 master,则可以在您通常指定的任何位置指定 origin

:)

【讨论】:

  • 你应该添加它的作用
猜你喜欢
  • 2016-12-27
  • 2018-06-19
  • 1970-01-01
  • 2022-01-12
  • 2020-10-19
  • 2023-03-18
  • 2018-04-16
  • 2020-09-21
  • 2022-12-01
相关资源
最近更新 更多