本地项目的一个git仓库损坏如何恢复
项目运行时,内存消耗过大,连续运行了一两个星期没关机
电脑突然死机,重启动电脑后,发现该项目的git仓库不能用了,崩溃
本地的代码已提交到版本库,则未push到远程库中
git statusfatal: not a git repository (or any of the parent directories): .gi
关键背景:
1、window系统,连续运行了一两个星期未关机
2、使用vscode开发node前端项目(react),当时项目正在运行中(yarn start
)
3、使用git 版本git version 2.24.1.windows.2
4、vscode的版本如下
问题现象
1、进个项目文件夹中,使用git命令时报如下错
$ git status
fatal: not a git repository (or any of the parent directories): .git
实际上,项目文件夹中,存在
.git
文件夹
2、git软件本身可以正常使用,其它git项目也可正常使用
3、.git
文件下的所有文件都齐全
解决过程
- step.1 把
.git
文件夹目录下的所有文件研究一遍,创建一个新文件夹并把远程库clone下来
发现仓库的数据应该完整的
与远程库的.git
对比之后,现HEAD
出现了乱码,于是猜测有可能是该HEAD
文件在死机重启过程中被修改了
文件名 | 说明 | 备注 |
---|---|---|
hooks | 存放一些sheel的地方 | |
info | 存放仓库的信息 | |
logs | 保存所有更新的引用记录 | |
object | 存放所有git对象的地方 | |
refs | 存放提交hash的地方 | heads:保存当前最新的一次提交的哈希值 |
COMMIT_EDITMSG | 最新提交的一次Commit Message,git系统不会用到,给用户一个参考 | |
config | github的配置信息 | |
description | 仓库的描述信息,主要给gitweb等git托管系统使用 | |
FETCH_HEAD | 是一个版本链接,指向着目前已经从远程仓库取下来的分支的末端版本 | |
gitk.cache | - | |
HEAD | 映射到ref引用,能够找到下一次commit的前一次哈希值 | |
index | 暂存区(stage),一个二进制文件 | |
ORIG_HEAD | HEAD指针的前一个状态 | |
packed-refs: | 当更新一个引用时,git不会packed-refs,而是会在refs/heads下写入一个新文件。当查找一个引用时,git首先在refs目录下查找,如果未找到则到packed-refs文件中去查找。 |
- step.2 把
head
文件中的指针修改为ref: refs/head/master
修改完成后,git立即可以重新使用,但是由于
HEAD
文件的指向是刚才修改为master的
有可能在HEAD
损坏之前的分支为其它分支,这时查看一下git状态
- step.3 查看状态
git status
,果然发现有许多的修改,说明当前的代码与HEAD
指向有相符
因为,当前
HEAD
指的是master分支,之前是另一个分支,所以版本库会认为有许多代码被修改了
只需要重置一下即可
.* step.4 重置git reset --hard
完成!