背景叙述:

前几天,上传自己的个站到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的实现机制)!

github总结(4)--关于git reset --hard这个命令的惨痛教训的更多相关文章

  1. git 学习笔记 —— 切换和恢复提交版本( git reset/reflog/tag 命令)

    记录一下关于 git 不同提交版本间切换的操作以及如何恢复至切换之前的版本. 切换到之前提交的版本 —— git reset --hard 笔者在使用 git 时,首先接触到了一个"黑魔法& ...

  2. 【Git 学习三】深入理解git reset 命令

    重置命令(git reset)是Git 最常用的命令之一,也是最危险最容易误用的命令.来看看git reset命令用法. --------------------------------------- ...

  3. git reset --hard xxxxxxx

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

  4. Git reset head revert 回滚

    Overview 涉及Git一些日常操作 :) 基础知识 <Pro Git>至少了解branch,commit的概念,及基本的原理 Git常用魔法 存档:master代码回滚方法 我是QA ...

  5. git revert 与 git reset

    Git版本回滚之 git revert 与 git reset 在使用 git 的时候,如果错误push之后,经常会回滚版本. git的回滚有两种方式: revert命令:这种方式,是用一种反向的 p ...

  6. git rm 与 git reset

    https://www.cnblogs.com/sunshine-xin/articles/3521481.html 1. git rm --cached file will remove the f ...

  7. git reset命令学习

    我们在使用git进行版本管理的时候,如果遇到需要回退代码的情况,一般会用 git reset 命令,不过这个命令还有几个参数,这篇文章就来详解一下. 先来了解一下 git 大致的工作流程,配合这张图会 ...

  8. git操作之三:git reset

    在上篇文章中介绍了git restore命令,该命令的可以看作是撤销命令,文件在不同的状态下,使用git restore <file> 命令,会撤销对文件的修改,是文件回到修改前的状态也就 ...

  9. git reset HEAD 与 git reset --hard HEAD的区别

    感谢原文作者:天地逍遥 原文链接:https://www.jianshu.com/p/aeb50b94e6c0 git reset HEAD 是将咱暂存区和HEAD的提交保持一致 git reset ...

随机推荐

  1. sqlzoo:2

    顯示具有至少2億人口的國家名稱. 2億是200000000,有八個零. SELECT name FROM world 找出有至少200百萬(2億)人口的國家名稱,及人均國內生產總值. select n ...

  2. SpringBoot加Poi仿照EasyPoi实现Excel导出

    POI提供API给Java程序对Microsoft Office格式档案读和写的功能,详细功能可以直接查阅API,因为使用EasyPoi过程中总是缺少依赖,没有搞明白到底是什么坑,索性自己写一个简单工 ...

  3. H5测试点总结-UI测试、功能测试、兼容性测试、体验相关(弱网、资源、手机操作等)、安全性测试、性能测试

    一.概述 1.1 什么是H5 H5 即 HTML5,是最新的 Web 端开发语言版本,现如今,大多数手机 APP 页面会用 H5 实现,包括 PC Web 站点也会用它开发实现.所以 Web 的通用测 ...

  4. 论python中的函数参数的传递问题。

    python是完全面向对象的语言,在参数传递的过程不能使用值传递,引用传递的概念,而应该使用immutable和mutable.在java中,除了object,其实还有8种基本数据类型,才有了参数传递 ...

  5. Httpclient代码

    /// <summary> /// 显示 /// </summary> /// <returns></returns> public ActionRes ...

  6. SQL Server Cast、Convert数据类型转换

    一.概述 本篇文章转载来着官网在线文档,文章主要介绍SQL Server数据类型转换相关语法.隐式转换.Date样式等. 语法 Syntax for CAST: CAST ( expression A ...

  7. kali linux学习笔记(四) : 网络端口大全介绍

    端口大全介绍 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发 ...

  8. 【RL-TCPnet网络教程】第21章 RL-TCPnet之高效的事件触发框架

    第21章       RL-TCPnet之高效的事件触发框架 本章节为大家讲解高效的事件触发框架实现方法,BSD Socket编程和后面章节要讲解到的FTP.TFTP和HTTP等都非常适合使用这种方式 ...

  9. Dubbo+zookeeper构建高可用分布式集群(二)-集群部署

    在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...

  10. php免杀教程【绝对原创】

    .函数回调. 使用其他函数进行调用,并执行. 如:array_map('a'.'s'.'se'.'r'.'t',array($_POST['x'])); 详细教程 + 测试结果(安全狗+360主机卫士 ...