Git仓库由于中断的提交而损坏

3

我在提交代码时误按了 Ctrl+C,导致本地的 git 仓库损坏(回退到两次提交前)。

请问应该如何修复?

以下是 git stash 命令的输出:

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

git fsck --lost-found的输出如下:

$ git fsck --lost-found
notice: HEAD points to an unborn branch (Multi-Threading)
Checking object directories: 100% (256/256), done.
Checking objects: 100% (67/67), done.
error: refs/heads/Multi-Threading: invalid sha1 pointer 0000000000000000000000000000000000000000
dangling commit 2d5af11417b9508ece28c1bb1502e5299a2fa2d0
dangling commit 3b0dfd77c49c12a23469c036db7f45378a1bf740
dangling commit 47d212cf4c018b9f3544325a26c90f74d3323489
dangling commit 82674535931943f64b4a3475c14475591d84a318
dangling commit 83604cf338ccb0491081f7f27c2217bc11fba0c2
dangling blob a3133e60fe8fec7977270d1e93c0869e169024f1
dangling commit aae880196744421d1ffbf7dc23aa8965d4ee1f46
dangling blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
dangling commit f9558f1235c4a239b2c8d0677d2b1c31eb400836
git reflog 的输出结果:
$ git reflog
fatal: your current branch 'Multi-Threading' does not have any commits yet

同时,也无法在.git/refs/heads/Multi-Threading中进行编写:

$ echo 47d212cf4c018b9f3544325a26c90f74d3323489 > .git/refs/heads/Multi-Threading 
An error occurred while redirecting file '.git/refs/heads/Multi-Threading'
open: No such file or directory

这看起来是一个非常棘手的问题,我以前从未见过 +1。 - Tim Biegeleisen
2个回答

3
中断 Git 操作不应该破坏仓库(Git 捕获键盘中断信号并优雅地处理它们),但此时,您需要弄清楚 .git/refs 发生了什么问题:
  • 它作为目录存在吗?
  • 是否包含名为 packed-refs 的文件?如果是,请小心使用此文件的内容。 如果没有,那可能没关系。
  • 它是否包含子目录 headsremotes 和/或 tagsheads 应该肯定存在,其他两个将在必要时创建。
  • 如果 .git/refs/heads/ 存在,则在尝试在其中创建名为 Multi-Threading 的文件时,为什么会出现错误?

47d212cf4c018b9f3544325a26c90f74d3323489 放入名为 .git/refs/heads/Multi-Threading 的文件中似乎是正确的方法(虽然我不知道为什么您选择使用 47d212cf4c018b9f3544325a26c90f74d3323489 作为特定提交; 请注意,由 git fsck 显示的那些悬空提交以某种随机顺序出现; 但其中一个悬空提交可能是正确的)。

(如果存在 packed-refs 文件,则其中包含已经打包成单个文件而不是许多单独文件的引用值。它的任何格式都是 Git 喜欢的。请注意,创建 .git/refs/heads/<name> 文件将覆盖相应的 packed-refs 值。)


1
我的问题是由于系统错误导致的。
我重新启动了计算机,然后再次执行了echo 47d212cf4c018b9f3544325a26c90f74d3323489 > .git/refs/heads/Multi-Threading,这次没有出现错误,问题得到解决。

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