背景敘述: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的實現機制)!