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

背景叙述:javascript

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

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

恩,当时真是吓到快要冒冷汗(来来来,用小拳拳锤锤本身,怎么这么不长心呢!)!!!惟一感觉总结就是:若是哭倒长城能让文件长回来,想必我是颇有决心去试试的!!!!java

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

先看看git reset --hard xxxxxx 命令长啥样。编程

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

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

=================慎用  git reset --hard xxxxxx 命令========================app

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

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

 

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

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的实现机制)!

相关文章
相关标签/搜索