Git 的一次掉坑经历 (深坑)

  1. 2020.08.24 作死开始

    早九点,最近发现 git 跟 pycharm 混用让自己 git 的学习过程出了点问题,尝试多次无果后,决定去网上求助大神。

  2. 愚蠢作死

    出于对网友们的信任,找到一片看起来靠谱的博客后果断一遍无脑操作,复制粘贴,在 回车 的时候 看到 git reset --hard ,顿觉大事不妙 (由于之前使用 git 最近一次是在去年学习时使用,疫情期间,全程看书,丝毫没有将代码 git add 与 git commit 的觉悟)

  3. “皇上”驾崩了

    没了没了,全都没了。回过神的自己看着近一年 兢兢业业 “耕种” 的结果,全都丢了,真删了个干净,空空如也。

  4. 慌了

    当时自己告诉自己镇静,网上慢慢找恢复办法,虽然告诉自己别慌,自己也觉得自己没慌,但事后就后悔,非常后悔,当时绝对是慌了,尽管对网上的办法保持警惕,但还是胡乱操作了许多,更乱了

    尝试了回退,但是最近一次 git commit 太过于遥远,仅恢复了 30% 文件,心还在滴血 (几千个代码文件、几十个笔记文件啊)

  5. 一篇有用的 Blog : https://www.cnblogs.com/hope-markup/p/6683522.html

    绝望的时候,找到了这篇博客 (救我于水火) , git fsck --lost-found 这个命令 执行后在 .git/lost-found/other 中找到了大堆的 文件 (这里面包含了所有的没有被commit的文件), 根据博客作者所说 find .git/objects -type f | xargs ls -lt | sed 60q 这个命令,你就可以找到最近被你add到本地仓库的 60个文件 (可以自定义查看多少个)

  6. 开始恢复 (悲惨的)

    由于我丢失的文件太多,看着 other 文件夹下生成那浩浩荡荡 六七千个 文件 (文件名是 hash 值,由于 git reset 时将索引树一起重置了,没办法根据索引定义文件名),完全不知道哪个是哪个

    尽管当时内心十分清楚的告诉自己写个脚本,写个脚本就可以快速恢复,但是对于自己不清楚的文件内容,自己毫无头绪 (一定要把里面悬空文件多复制几份,然后对复制后的文件进行修改,保证损失环境的 无变化)

  7. 一点点寻找

    文件二进制可以识别出大部分无意义的文件,于是我拿出了做搁置很久的 010 Editor 查看几个后发现太过缓慢;灵光一现然后打开 VS Code 下载插件 查看 16进制。

    这样一个个文件看过去,估计自己看完眼睛也已经废掉了 ,于是开始总结经验

  8. 发现经验

    经过看了几百个文件后,了解到 other 文件夹下文件类型大概分为 Png (89504E47)、Jpg (FFD8FF)、txt (txt文件十六进制没有固定格式)、Gif (47494638)、zip (504B0304) …

    好吧略有点多,试了试写以十六进制脚本查看用来区分,(自己太菜,写出来对于各种txt文件,md文件, 无法有效区分)

  9. 改变思路

    通过直接 二进制读取 文件将文件名 与 二进制读取每个文件前几个 二进制数据 发现各种文件后缀的二进制文件,鉴于里面笔记较多,决定半手动处理 (庆幸自己学习的时候有良好的代码习惯,代码文件读取出来前几个字节文件基本相同,节省大量区分时间)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import os
    import shutil


    def check_file(file_path):
    file_names = os.listdir(file_path)
    for file_name in file_names:
    with open(os.path.join(file_path, file_name), "rb") as f:
    date = f.readline(10)
    f.close()
    # if str(date) == str(b' b'\xff\xd8\xff\xe0\x00\x10JFIF''):
    # os.remove(os.path.join(file_path, file_name))
    # os.rename(os.path.join(file_path, file_name), os.path.join(file_path, file_name) + ".jpg")
    # shutil.move(os.path.join(file_path, file_name) + ".jpg", "E://save/png")

    print(file_name, date)


    check_file("e:\\新建文件夹\\other")
  10. 分类,修复

    通过以上代码将 Png、Jpg、Gif 文件统统删除,直接少了一半无用文件,舒爽

    通过对 exe 文件重命名, 并且 移动到准备好的分类的各种文件下,方便统一整理

    对其他不同种类文件添加后缀,移动到文件夹

    对于剩余所有文件放入一个文件夹

    删除无用的 图片文件、压缩文件、exe 文件等

  11. 最后剩余的有用的

    根据自己定义的写代码的规范,将不同学习阶段的代码区分,按顺序统一命名,将笔记提取出来,按内容重新整理

  12. 搞完收工

    真的心塞,以后对于网上的代码一定要先搞懂作用再使用; 培养好自己良好的写代码规范;合理使用 git

    最后希望大家都不要掉到这个坑里,一定要记得修改任何东西之前做好保存,留好备份