背景叙述:

前几天,上传自己的个站到git上的时候,手欠脑发晕的用了次git reset –hard xxxxxx 命令。由于只在线上传入了一个index.html页面(自己都不知道自己咋想的,就这么干了,O__O”…),且第一次commit的时候也只commit了一个index.html文件,其他文件的只是通过git add –all命令进行本地追踪。

然后,突发奇想,想恢复到第一次提交的时候(天知道当时自己咋想的)!于是自然(大概也只有天知道当时手咋那么自然随意)的用了git reset –hard xxxxxx 命令,结果~~~~~~~(>_<)~~~~ ,我的乖乖,等我反应过来,所有的文件除了第一次commit的index.html还在,其他的,其他的,都不见啦!!!!

恩,当时真是吓到快要冒冷汗(来来来,用小拳拳锤锤自己,怎么这么不长心呢!)!!!唯一感受总结就是:如果哭倒长城能让文件长回来,想必我是很有决心去试试的!!!!

====================一条痛改前非的分割线============================

先看看git reset –hard xxxxxx 命令长啥样。

ps:返回到某一次commit前的代码

git reset --hard xxxxxx    //强制返回到某次提交前的源码状态

=================慎用  git reset –hard xxxxxx 命令========================

接下来的几个小时,开始了心情惨淡又前路漫长的网上寻找解决套路之旅!!!!!!

好在,翻阅了一大波的资料后,finally,finally,终于找到了解决的方案!!!!!!

====================分  解  走  出  套  路  之  旅=========================

part 1:

首先找到了这篇文章,http://www.tuicool.com/articles/mqm2uiF,感谢作者!!

中间有这么一段话,如下:

翻译过来:

如果你没有commit你的本地修改(甚至于你都没有通过git add追踪过这些文件,当他们被删除,git reset –hard对于这些没有被commit过也没有git add过的修改来说就是具有毁灭性的,destructive!!)

but,如果你幸运的是曾经通过git add命令追踪过这些文件,只是没有commit它们而已!那么试试git fsck –lost-found这个命令吧!然后你就可以在本地项目文件中路径为.git/lost-found/other(楼主亲自试验就是这个路径)中找到它们!!并且呢,这里面包含了所有的没有被commit(指定到某次commit)的文件,甚至可能还包括你每次git add的版本(version一词实在不知道在这里怎么翻译,姑且就认为是版本吧)!

使用git fsck –lost-found这个命令,通过.git/lost-found/other这个路径,你可以恢复任何你git add过的文件!再通过find .git/objects -type f | xargs ls -lt | sed 60q这个命令,你就可以找到最近被你add到本地仓库的60个文件,综上所述,希望对你有所帮助!

当然咯,也就是but的but,不幸中的不幸,如果你没有git add过的文件呢,被git reset –hard这个命令整过之后呢,就如你自己执行delete命令一样,再也尸骨难寻啦(也就是真的毛都不剩了!!默哀三秒)!!!!

part 2:

首先呢,楼主真的使用git fsck –lost-found 这个命令,除了在命令行窗口里面见到了一大堆的ID号码(我的小心脏!!因为真的删掉了很多文件,~~~~(>_<)~~~~ ),然并卵,真的要通过一个个ID号码去生成吗?想必内心拒绝的声音也是杠杠的!!可是没有其他办法啊,我真是试过,试了一个之后,果断摒弃啦!!(内心OS:还是回去慢慢写一遍吧!!)

ps:此间在网上还搜到了

git show 2e43cd56ee4fb08664cd843cd32836b54fbf594a

git merge 2e43cd56ee4fb08664cd843cd32836b54fbf594a

这两个命令,均没啥特别反应(就是还是不是自动生成一个文件啊!)!!

(当然咯,楼主还学到了一个新的命令 git reflog,一堆搜出来的资料中说这个对于恢复文件有用,结果只是看到了提交记录列表,真是闹心!!)

part 3:

就在绝望之际,试了find .git/objects -type f | xargs ls -lt | sed 60q(这个里面的60参数可以更改成任意你喜欢的数字,比如250啦,它只是代表你想找回的最近的多少次add过的文件)。其实期间已经多次试过这个命令,windows命令行窗口告诉我 xargs不是什么什么可以执行的操作,然后我就困惑在什么叫做什么什么不是可执行的操作中不能自拔!!!

part 4:

终于写到了一个happy ending的位置,撒花!!好吧,尽管也不是那么happy,但是相比较而言,也算是一个完美的结局!!比起重写,比起一个个的ID添加生成,这个用的时间少的多!!!

第一步:找到.git/lost-found/other这个路径下的文件

第二步:将这些文件拷贝到一个其他的地方(毕竟小心得来的残骸,就要长点心好好保护啦!)

第三步:在sublime或者任意的编程软件中打开,就能看到每个文件的本质是啥啦!!!!!

① 图片或者doc等文件,sublime打开就长这样,自己重新命个名字呗!将00fffbbcab92ec62f7709de8df1fdbb3bbe001b8等改成xxx.png 或者xxx.jpg,如果是图片,当即就可以预览的!如果不是呢,就试试xxx.doc啦!!

②html、css、javascript等等文件,打开一看便知具体是啥,接着就是自己改名字咯!00fffbbcab92ec62f7709de8df1fdbb3bbe001b8

改成xxxx.html或xxx.css或xxx.js啦!!

part 5:

最后总结一句,没事不要随便用  git reset –hard xxxxxx 命令,这个强制恢复到某次提交真是太霸道啦!!恩,还有一句,git fsck –lost-found 真是个无比强大的命令!!!

git fsck --lost-found  //找回git add过但是已经不存在文件中的内容(不知道这么翻译对不对,我是这么理解的)

最后的最后,要保持良好的commit习惯!恩,反正commit又不花钱,干嘛不多commit几下呢,至少也要多git add几次!!!!O(∩_∩)O哈哈哈~

(小小的返个场,关于这个解套之旅,楼主还发现了一篇好文。http://www.itwendao.com/article/detail/370021.html,解释了git fsck –lost-found的实现机制)!

关于git reset --hard这个命令的惨痛教训相关推荐

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

    git reset --hard HEAD 后恢复暂存区文件 1.参考资料 git reset–hard后恢复暂存区文件 git reset–hard后恢复暂存区(未提交)文件 关于git reset ...

  2. 【Git】Git 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )

    文章目录 一.查看提交记录 git log 1.查看详细提交记录 2.查看简略提交记录 二.版本回滚 git reset 1.Git 中的版本表示 HEAD~1 2.版本库代码回滚 三.撤销回滚 1. ...

  3. git reset --hard xxxxxxx

    关于git reset --hard xxxxxxx命令之Git版本回退 今晚代码写着写着就头脑有点发懵,手指也不听使唤了竟然让我敲出了 git reset --hard 命令,然后的然后就是之前所有 ...

  4. Git的撤销操作 git reset HEAD -- <file>

    在项目中我们也经常会使用到撤销操作 使用这一节我们就讲一讲Git的撤销操作 撤销操作主要有如下几种 git commit   --amend        撤销上一次提交  并讲暂存区文件重新提交 g ...

  5. git reset --hard、git reset --sort及git revert区别

    一. 在git操作中,有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用git reset –-soft/hard命令. 1.二者区别: git reset –-sof ...

  6. git reset 怎么还原_git reset –hard后的恢复操作

    先说下我遇到的问题和解决办法,然后再放原文. 我遇到的问题 在初始化一个比较大的项目时,由于最后一次commit的文件数量较大,无法成功push,百度无果后想要撤回这次commit,于是手贱用了git ...

  7. git 9个小命令(三年修仙五年摸鱼也有喔) 一条龙服务

    前言 本文是记录今天学习过的git命令哈,感觉还是很有趣,就是感觉很高级哈,git命令是一种管理代码的命令,今天学的呢就是一些版本号管理这种的,比如说一个PS图片,产品的外观设计,就拿今天讲的拿公司的 ...

  8. 掌握 git reset 使用

    通常我们提交代码一般都是 git add ,git commit -m, git push 的这么个流程.添加到暂存区,提交到 git 库生成版本号,push 到远程仓库以供他人可以使用.这是一个完整 ...

  9. git reset, git status, git clean, .gitignore, git diff, git restore 的关系梳理

    当进入装有git的目录里,创建一文件,如 $touch test.txt 这时候,运行git status,就会发现这个文件出现在untracked files中 $git status On bra ...

  10. a commit git 参数是什么意思_Git中的git reset的三种参数的区别

    我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是 "git-reset – Reset current HEAD to ...

最新文章

  1. 干货 | B端产品如何设计权限系统?
  2. 给采购凭证分配合作伙伴方案
  3. 一篇不一样的docker原理解析 提高篇
  4. 智能家居的尴尬:概念比用户火
  5. linux alias别名管理
  6. 亚洲最佳电影TOP100出炉 你看过几部?
  7. GreenDotNet0.1.1发布(.Net精简环境)及示例.Net在线漫画下载器
  8. 苹果电脑Chrome浏览器截网页长图
  9. Android性能优化之页面优化
  10. python 005 __ 小斌文档 | 函数的定义和调用
  11. Hutool学习 —— 设置文件-Setting
  12. spark本地项目报错:Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  13. 读“人生有一种牛逼,叫我能背下来”
  14. [JAVA安全webshell]冰蝎jsp木马分析
  15. spring boot共享电动单车管理系统毕业设计源码131016
  16. 单例模式——国庆收心
  17. 2-(4-噻吩)[4,5f][1,10]邻菲啰啉|cas1070190-29-2-齐岳
  18. matlab xpc 环境pci板卡驱动编写,XPC环境下PCI板卡驱动
  19. 为什么SEO效果不明显
  20. background and notification of local

热门文章

  1. Starbound正式版的Mod制作(三)简…
  2. 看到这类代码,别再说你不认识了!手把手带你认识初阶结构体(结构体类型的声明、初始化、成员访问与传参,全在这篇文章里)
  3. 用Excel做了7天报表,这个领导喜欢的可视化工具,只用了7小时
  4. C++几个常用的排序
  5. mysql获取autoincrement_MySQL获取Auto_increment字段刚插入的值 | 学步园
  6. 【聚沙成塔】Linux环境下NodeJs升级
  7. 敏捷开发系列学习总结(18)——Scrum Master的情景领导力模型
  8. python请输入星期几的第一个_Python 根据星期英文首字母判断星期几
  9. 计算机主机hs编码,电脑设备的进出口品名
  10. 扫码点餐有哪些优势?