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的實現機制)!

相關文章
相關標籤/搜索