前言

  • 新手第一次使用git,对这玩意儿完全没有什么认识,只是想着从学习的角度出发接触一下这个。于是乎恰好手上刚做完一次课程设计作业,想拿此进行练手,顺便上传到github上去。于是我在github上新建了一个仓库,想着用git把我的代码传上去。

悲剧发生

  • 首先由于我对这个东西的认知实在匮乏,在本地瞎操作了一番,不知怎么得不小心从远程仓库中pull了一下,然后,整个文件夹清净了……

情景复现

  • 这是我发现问题后第一时间备份的目录,里面的东西已经是从github上拉下来的了。但是,/.git目录下足足有12MB大小,说明还有恢复的可能性。在命令行中看下状态
nucleus@nucleus-GL552VW:~/桌面/beego_survey$ git status
位于分支 master
您的分支领先 'origin/master' 共 1 个提交。(使用 "git push" 来发布您的本地提交)无文件要提交,干净的工作区
nucleus@nucleus-GL552VW:~/桌面/beego_survey$ git log
commit 4baf4b0e284f43975ec45c24dcb0a541d4a2b734 (HEAD -> master)
Author: xxxxxxxx <xxxxxx@xxxxxx.com>
Date:   Fri Jun 28 22:24:50 2019 +0800Revert "Initial commit"This reverts commit 0ff0709d2cc8d339587afac8f5edbe6c95719f74.commit 0ff0709d2cc8d339587afac8f5edbe6c95719f74 (origin/master)
Author: xxxxxxxx <xxxxxxx+xxxxxx@users.noreply.github.com>
Date:   Fri Jun 28 21:36:18 2019 +0800Initial commit
nucleus@nucleus-GL552VW:~/桌面/beego_survey$ git reflog
4baf4b0 (HEAD -> master) HEAD@{0}: revert: Revert "Initial commit"
0ff0709 (origin/master) HEAD@{1}: reset: moving to HEAD
0ff0709 (origin/master) HEAD@{2}: reset: moving to HEAD
0ff0709 (origin/master) HEAD@{3}: reset: moving to HEAD
0ff0709 (origin/master) HEAD@{4}: initial pull
  • 总之,看上去貌似没有办法直接回退到出事之前的状态了。只好上网上搜索看看有没有可能恢复出单个文件之类的。

转机

  • 我搜到了一篇博文,可以找回暂存区丢失的数据。我尝试按博文中的内容恢复出一个文件,发现可以。唯一的问题是我无法确定恢复出来的文件原来的文件名是什么,是什么类型的,必须要恢复出来后打开查看分析才知道。而且这个方法搜到的文件足足有四百多个,我没有耐心去把这四百多个文件一一分析一遍。不过,既然想不到其他办法,就先提取出来试试吧。

具体过程

  • 首先,我先把所有可恢复的问卷罗列了出来:
nucleus@nucleus-GL552VW:~/桌面/beego_survey$ find .git/objects -type f
.git/objects/18/e6e7f331ef3868999b540ac291d21f01620237
.git/objects/18/6c7a6c602d2404382e91372a095520cec357b9
.git/objects/18/2a71ad0dfad48c90d709d33fc0d17ace48f97f
.git/objects/18/fc821ec362860a9044db38abf742ce0f1f94cd
.git/objects/18/323069600dbef29fb8d56d48c5e9068dbf2eb3
.git/objects/18/24b61637868e723d44af506f5a5b5241bfdc5d
.git/objects/e9/f6c3deb8c0ced1b5917d60859b7f6fb2923ebe
.git/objects/e9/75cd899efa1c2dc4386034c4601754dfc2a5a2
.git/objects/ec/8baa0aa593aa0d36c83419698e13efb02ea9a2
.git/objects/3c/b05c992b4f9c40652a6dcc76e7d204b1a8f301
...(此次省略四百多行)
.git/objects/f9/9b00fce302e730e9e8a116f1b7bbfd662efb65
.git/objects/f9/5ffc88f07510593c6e7bf05fd46ddc6b6da9f7
  • 之后,我把输出复制出来,在excel里简单得处理了下,构造出如下的命令:
git cat-file -p 18e6e7f331ef3868999b540ac291d21f01620237 > 1.txt
git cat-file -p 186c7a6c602d2404382e91372a095520cec357b9 > 2.txt
git cat-file -p 182a71ad0dfad48c90d709d33fc0d17ace48f97f > 3.txt
git cat-file -p 18fc821ec362860a9044db38abf742ce0f1f94cd > 4.txt
git cat-file -p 18323069600dbef29fb8d56d48c5e9068dbf2eb3 > 5.txt
git cat-file -p 1824b61637868e723d44af506f5a5b5241bfdc5d > 6.txt
git cat-file -p e9f6c3deb8c0ced1b5917d60859b7f6fb2923ebe > 7.txt
git cat-file -p e975cd899efa1c2dc4386034c4601754dfc2a5a2 > 8.txt
git cat-file -p ec8baa0aa593aa0d36c83419698e13efb02ea9a2 > 9.txt
git cat-file -p 3cb05c992b4f9c40652a6dcc76e7d204b1a8f301 > 10.txt
git cat-file -p 3c2fa001fbd4d0a02750e45da4c9532ea5a98b6d > 11.txt
git cat-file -p 3cffcb06736e2836bd86a7f0410adda9b27be526 > 12.txt
git cat-file -p 418fb30710c451cf9901fd6722ee81bb5a39f9b3 > 13.txt
git cat-file -p 419c84e6a8cef3fe6596b259ccd76eee40ab003a > 14.txt
git cat-file -p 40f53615cf97fb079081aa3c0e437beb2652639c > 15.txt
git cat-file -p 4073e848ffd8cf11fd064a96d55c5f78197c9aa9 > 16.txt
git cat-file -p 277652342f8edb5a648eac4636853be5c995b11b > 17.txt
git cat-file -p f4d35b6e788d50254d5683c09558671c7ca2e343 > 18.txt
git cat-file -p f42f8e31b91f27d39892a4c4d361570d9951465d > 19.txt
git cat-file -p 31d8882661324aedb8693f8bb7322c4af8374ae0 > 20.txt
git cat-file -p a0e1c3c89474516f35d0671300b6b217d954f569 > 21.txt
git cat-file -p 22e471c3c9f754f342c7dbfaa520a7ea1f0cd521 > 22.txt
git cat-file -p 22004af98db222074472ca86cda86237cc8ec186 > 23.txt
git cat-file -p eed53e854148c484c5364d4986efeaf90c92baba > 24.txt
...(此次省略四百多行)
git cat-file -p aed38cc7e6ede4e1416629c890ae4fcd0f1681b1 > 486.txt
git cat-file -p dc4b54dec7d714ef0c7494f1fd533a75af81507d > 487.txt
git cat-file -p dc1fb50c1ebabbcd8c92b88678277b867dc82eb6 > 488.txt
git cat-file -p b302f2d5d53e4e5f2c038ffb6133bcf62a86a7f6 > 489.txt
git cat-file -p d876f60fb4fd2a1c421a4813ef080ac97b670465 > 490.txt
git cat-file -p d88f9ae3325abe40570f79ef4a90c0e7e316e362 > 491.txt
git cat-file -p d86345d2eb012c19b43d12c892dad149f2a6e847 > 492.txt
git cat-file -p f90a38702280291b413ecf123e69114caf910190 > 493.txt
git cat-file -p f99b00fce302e730e9e8a116f1b7bbfd662efb65 > 494.txt
git cat-file -p f95ffc88f07510593c6e7bf05fd46ddc6b6da9f7 > 495.txt
  • 这里命名成txt的原因是方便用文本编辑器查看。实际情况是这些全是原来项目中的各种类型的文件。我尝试打开几个,很快就找到了一些代码文件,另外还有一类文本引发了我的兴趣,比如我的1.txt里面是这样的
100644 blob 8f97866c18769208ac796da38df0a739c1530bab    answers.go
100644 blob 9917732ca26911eb34317eb180e66b6152abae7a    init.go
100644 blob a1d4722f36a9bbdc95b8f5c9d6f2a6ce4d227b7e    papers.go
100644 blob e59ccf7466aae25237a0f854ac64eee3542cb027    questions.go
100644 blob 1b177f3da4c045af1f99f0d2101f255ca574d04b    records.go
100644 blob 74f51c09bc69278fc3b938c35862ba4972c8d898    standards.go
100644 blob 66b4bfc83d4cd2322455df31c282893d1bda61be    users.go
  • 显然,8f97866c18769208ac796da38df0a739c1530bab是文件的id,answers.go是文件的原始文件名。而这类文本的特征是均以100644 blob开头。这样,我就把这些文件中包含100644 blob字样的文本全部提取了出来。
find -type f -name '*.txt'|xargs grep '100644 blob'
  • 得到的内容如下
./33.txt:100644 blob 76c2dfff50a1d30be5a025772861f35907ddcf8e    bootstrap-table-af-ZA.js
./33.txt:100644 blob 1291debc4da050f3a7f8a7d752c6479d34eddd9d    bootstrap-table-af-ZA.min.js
./33.txt:100644 blob f30be7bed26164833c494f1453738e6164086129    bootstrap-table-ar-SA.js
./33.txt:100644 blob eb86ff4ce8e8a4866e669f58f19f6f44d39b3594    bootstrap-table-ar-SA.min.js
./33.txt:100644 blob de565f7d644e3b449805436ce6c120a80f2842b0    bootstrap-table-ca-ES.js
...
./1.txt:100644 blob 8f97866c18769208ac796da38df0a739c1530bab    answers.go
./1.txt:100644 blob 9917732ca26911eb34317eb180e66b6152abae7a    init.go
./1.txt:100644 blob a1d4722f36a9bbdc95b8f5c9d6f2a6ce4d227b7e    papers.go
./1.txt:100644 blob e59ccf7466aae25237a0f854ac64eee3542cb027    questions.go
./1.txt:100644 blob 1b177f3da4c045af1f99f0d2101f255ca574d04b    records.go
./1.txt:100644 blob 74f51c09bc69278fc3b938c35862ba4972c8d898    standards.go
./1.txt:100644 blob 66b4bfc83d4cd2322455df31c282893d1bda61be    users.go
./159.txt:100644 blob 3e6a39b95e9e0b9d40d36a9d9a8a94307140ad32    ajaxSubmit.html
...
./343.txt:100644 blob 06e4814ff806a1d25d8e1f278eb9fd42390b9512    toastr.min.js
./372.txt:100644 blob 5e5ea0bc912b7e8b9eb447d35ee6fe5682616ce8    akari.jpg
./372.txt:100644 blob df15d50cbd9ef95ea51007053dd495147bdea545    new.png
./372.txt:100644 blob db3fbda8d30ff871b3c7421798776e8fb7a924a6    paper.jpg
...
  • 将其复制到excel里,再进行处理,构造出如下命令
git cat-file -p 76c2dfff50a1d30be5a025772861f35907ddcf8e > bootstrap-table-af-ZA.js
git cat-file -p 1291debc4da050f3a7f8a7d752c6479d34eddd9d > bootstrap-table-af-ZA.min.js
git cat-file -p f30be7bed26164833c494f1453738e6164086129 > bootstrap-table-ar-SA.js
git cat-file -p eb86ff4ce8e8a4866e669f58f19f6f44d39b3594 > bootstrap-table-ar-SA.min.js
git cat-file -p de565f7d644e3b449805436ce6c120a80f2842b0 > bootstrap-table-ca-ES.js
...
git cat-file -p 8f97866c18769208ac796da38df0a739c1530bab > answers.go
git cat-file -p 9917732ca26911eb34317eb180e66b6152abae7a > init.go
git cat-file -p a1d4722f36a9bbdc95b8f5c9d6f2a6ce4d227b7e > papers.go
git cat-file -p e59ccf7466aae25237a0f854ac64eee3542cb027 > questions.go
git cat-file -p 1b177f3da4c045af1f99f0d2101f255ca574d04b > records.go
git cat-file -p 74f51c09bc69278fc3b938c35862ba4972c8d898 > standards.go
git cat-file -p 66b4bfc83d4cd2322455df31c282893d1bda61be > users.go
git cat-file -p 3e6a39b95e9e0b9d40d36a9d9a8a94307140ad32 > ajaxSubmit.html
...
git cat-file -p 06e4814ff806a1d25d8e1f278eb9fd42390b9512 > toastr.min.js
git cat-file -p 5e5ea0bc912b7e8b9eb447d35ee6fe5682616ce8 > akari.jpg
git cat-file -p df15d50cbd9ef95ea51007053dd495147bdea545 > new.png
git cat-file -p db3fbda8d30ff871b3c7421798776e8fb7a924a6 > paper.jpg
...
  • 运行这些命令后,原工程所有文件便全部都被放到了一个目录下,剩下要做的事情就是把这些文件按照原来的结构存好就可以了

小结

  • 接触新事物时,一定要仔细学习,不要莽撞。另外这个方法仅适用于我这种新手操作直接把一个做好的项目给毁了了的操作。blob对象记录着git从开始到当前所有的文件的变化情况,因此在正式上手git后,这个方法并不好,而且都可以上手用于实际项目中的话,也不会出现这种问题,写本文仅为了记录这次删库的经历,希望各位新手引以为戒,做任何事情都要谨慎才行。

参考链接

  • Git 恢复暂存区文件
  • shell 搜索目录下所有文件包含某个内容的文件
  • Git object
  • 如何在 Git 中重置、恢复,返回到以前的状态

记初次使用git从误删整个项目到恢复所有文件的经历相关推荐

  1. git分支误删后恢复流程

    本文仅供学习交流使用,如侵立删! 记一次git分支误删后恢复流程 今天提交git 推送的时候,提示超出了100M限制,原来是项目下载的视频文件忘记删掉了,删除后又提交了一次,就出现了两个版本,初衷是想 ...

  2. git merge 回退_Git项目开发必备命令

    前言 Github:https://github.com/HealerJean 博客:http://blog.healerjean.com 1.开发常备 1.0.本地直接创建仓库 git init / ...

  3. git 上传代码到指定仓库_初次使用git上传代码到github远程仓库

    一.新建代码库 注册好github登录后,首先先在网页上新建代码库. 点击右上角"+"→New repository 进入如下页面:按照要求填写完成后,点击按钮创建代码库创建成功. ...

  4. Git 的安装与初次使用 —— Git 学习笔记 03

    Git 的安装与初次使用 -- Git 学习笔记 03 Git 的安装与初次使用 -- Git 学习笔记 03 安装 Git 在 Linux 上安装 在 Windows 上安装 初次运行 Git 前的 ...

  5. Git之深入解析Git的安装流程与初次运行Git前的环境配置

    一.版本控制 什么是"版本控制"? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统,对保存着软件源代码的文件作版本控制,但实际上,可以对任何类型的文件 ...

  6. 记一次 Git GitHub 实操

    记一次 Git & GitHub 实操 1.前言 之前写了一个名为 typora-tools 的小工具,主要实现了图片瘦身.标题编号.图片同步的功能,现在想将此项目上传至 GitHub 中,并 ...

  7. 记一次成功把Vue2后台项目改造成Vite2的踩坑经历

    文章目录 前言 一.项目背景 1.1.为什么要选择Vite 二.迁移前的准备 2.1.补全.vue后缀 2.2.移动public/index.html的位置 2.2.1.通过vite-plugin-h ...

  8. 初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)

    初次安装git需要配置用户名和邮箱,否则git会提示:please tell me who you are. 你需要运行命令来配置你的用户名和邮箱: $ git config --global use ...

  9. git 怎么为开源项目做贡献,怎么有效管理贡献者的提交

    ,当作为项目贡献者时,我们该怎么做才能方便维护者采纳更新:或者作为项目维护者时,又该怎样有效管理大量贡献者的提交. 5.1  分布式工作流程 同传统的集中式版本控制系统(CVCS)不同,开发者之间的协 ...

最新文章

  1. java for循环迭代_JAVA中的for-each循环与迭代
  2. nginx生产环境常用功能include 、虚拟主机别名、rewrite、nginx status详细解析
  3. STM32-内存管理
  4. 【MFC】在CHtmlView中准确判断页面加载完成
  5. 远程linux服务器mysql数据库导入和导出.sql文件
  6. js带有折行的警告框
  7. ExtJs Grid分页时序号自增的实现,以及查询以后的序号的处理
  8. Apollo进阶课程㉓丨Apollo规划技术详解——Motion Planning with Environment
  9. 在创投界有个公开的秘密
  10. linux子目录大小限制,如何解决linux子目录的数量限制?
  11. 华为云认证报名条件是什么?考试去哪里考?
  12. VS2010格式化快捷键
  13. 十岁陌陌更名“挚文集团”的战略新时代|财报解读
  14. 【读书笔记】名创优品的101个新零售细节-张桓.杨永朋,品质和供应链是核心竞争力
  15. 简单的E_mail发送
  16. 开环控制(自动控制理论)
  17. pikachu~~~验证码绕过(on client on server)
  18. java实现“进制转换-在线工具”
  19. selenium打开chrome浏览器闪退(进程结束后关闭浏览器)解决方法
  20. R语言入门——不掉包实现FNN(单层感知机)

热门文章

  1. vue 路由嵌套(子路由跳转报错或者失效解决方法)
  2. win11右键菜单改回win10的操作方法
  3. Comments are not permitted in JSON.报错
  4. mysql事务ACID原理MVCC 幻读
  5. 帆软报表跨域请求头带自定义属性报403错误
  6. 男人不得不知的100句话
  7. 运用css和Html动画实现会动的摩天轮
  8. 最详细的【微信小程序+阿里云Web服务】开发部署指引(一):准备开始
  9. 如何打造一款专属于自己的高逼格电脑桌面
  10. 苹果8p电池多少毫安的_“纸电池”有望商业化!26800毫安薄如纸,抵15块苹果手机电池!...