git reset --hard HEAD 后恢复暂存区文件

git reset --hard HEAD 后恢复暂存区文件

1、参考资料

  1. git reset–hard后恢复暂存区文件
  2. git reset–hard后恢复暂存区(未提交)文件
  3. 关于git reset --hard这个命令的惨痛教训

2、前言

我 TM 脑子被驴踢了,添加了一些文件,没有配置 .gitignore 文件直接执行了 git add .,导致一些本不该添加到 git 版本管理的文件被加入了跟踪缓存区。

本来使用 git rm --cached 文件通配符 就能解决的事情,我手欠加脑袋抽风,执行了 git reset –hard HEAD 命令,重置了工作区和暂存区,回来一看,自己码了一天的代码全没了。。。

哇哦,小拳拳锤自己胸口

3、解决办法

find .git/objects -type f | xargs ls -lt | sed 60q 命令

该命令可以找回最近的 60 次 git add 提交的文件,但对于没有 add 过的文件,抱歉,尸骨无存~

image-20210205113823351

git cat-file -p ID > recover.txt 命令

该命令可以将 ID 所示的文件读取出来重定向保存到 recover.txt 文件内,那有同学就会问了:老湿老湿,你怎么知道一定时 .txt 文件?别着急,后面会讲~


提交的文件 ID

ID 是 objects 后面的一串东西(去掉 /),比如 -r--r--r-- 1 Heygo 197609 1706 Feb 5 10:52 .git/objects/37/755585613dbd77013b8c86abab558097794314 的文件 ID 为 37755585613dbd77013b8c86abab558097794314


恢复文件

执行 git cat-file -p ID > recover.txt 命令后,在 git 仓库的主目录下可以找到恢复的文件

image-20210205114323056

判断文件类型

恢复图片或文档

将 recover.txt 文件用 Sublime Text 软件打开,发现是二进制文件,可以尝试修改其后缀名,我这里原本是有一个 .ico 文件,因此我将其后缀名修改为 .ico

image-20210205114458713

哇哦,好起来了

image-20210205114804992


恢复文本文件

将 recover.txt 文件用 Sublime Text 软件打开,发现是文本文件,可根据其内容修改后缀名,这里是 .bat 批处理文件

image-20210205114913464


  1. 重复执行如上操作恢复近期被删除的文件,
  2. .pack 文件是 git 自带的文件,无需恢复。.git/objects/pack/.pack为压缩后的文件,把 .git/objects/ 下松散的文件进行了压缩,.git/objects/pack/.idx 为压缩后的索引,方便快速在压缩的文件里找到某个文件

image-20210205120112512

4、总结

git reset --hard 要慎用,因为此操作会清空工作区和暂存区,如果我们只执行了 git add 命令将文件提交到暂存区,还没有执行 git commit 命令将文件提交到本地库,那就哦豁

代码要及时 commit!代码要及时 commit!代码要及时 commit

猜你喜欢

转载自blog.csdn.net/oneby1314/article/details/113706217