在進行正文之前先簡單介紹下git reset
命令
git reset
git reset
命令用于改變當前的倉庫狀態(tài)账忘,簡單的場景用例:假設(shè)一次修改了兩個文件,然而需要對這兩個文件分別進行兩次提交熙宇,在進行緩存操作時(git add
)鳖擒,不小心將兩個文件都進行了緩存,此時我們需要對其中一個文件取消緩存烫止,此時就需要git reset
操作來實現(xiàn)蒋荚,如下圖
然后,對b.txt
進行commit
操作烈拒,然后再對a.txt
進行add & commit
操作
對于git reset
命令添加了--hard 參數(shù)后會怎樣呢圆裕,在git官網(wǎng)的reference上 有如下一段話
也就是說,添加--hard
參數(shù)后荆几,會回到上次commit
的狀態(tài)吓妆,也就是說從上次commit
之后的的修改都將被重置,換句話說這些數(shù)據(jù)都丟失了吨铸,所以要謹慎操作哦行拢。
前置知識就到這里了,開始今天的重點诞吱。
當我們進行了git reset --hard
操作進行了版本回退舟奠,現(xiàn)在我們又需要之前的修改信息,也就是說我們需要版本回退之前的文件信息房维,此時我分了三種情況
- 之前的修改進行了
commit
提交沼瘫,也就是說我們回退前的修改(曾經(jīng))存在于版本里; - 之前的修改未進行
commit
提交,但是進行了git add
操作咙俩; - 之前的修改未進行
commit
提交耿戚,也未進行git add
操作。
如果時第一種情況阿趁,很簡單我們拿到之前修改的commit
的哈希值(或者說id)膜蛔,然后執(zhí)行 git reset --hard [hash]
就可以回退到之前修改的狀態(tài)。
怎么拿hash
脖阵, 這個好說皂股,可以執(zhí)行命令git reflog
命令,它會顯示出你之前的所有操作
像這個
62f039e
就是我的reflog
提交的哈希值命黔,對其進行reset
即可
如果是第三種情況呜呐,不好意思暫時還沒有找回的辦法就斤,如果你有歡迎拿出來大家交流
今天的重點就是第二種情況,畢竟曾經(jīng)我也以為此情況無解卵史,直到后來這邊文章誕生前战转。
今天的主角命令 git fsck
,這里呢不具體講解此命令以躯,只是簡單描述利用此命令進行文件恢復槐秧。
如圖示,我新建了文件c.txt
并添加了內(nèi)容 'git fsck'忧设,添加到緩存之后進行了reset
操作刁标, 此時因為沒有進行git commit
操作所以沒有hash值,可供恢復址晕,這個時候需要進行操作 git fsck --lost-found
操作膀懈,返回如下結(jié)果:
關(guān)于此命令,git官網(wǎng)的解釋
[圖片上傳失敗...(image-deb41a-1562049785342)]
根據(jù)提示谨垃,找到目錄'.git/lost-found'启搂,可以看到,
我們在‘commit’和‘other’目錄下分別看到命令窗口打印出的文件刘陶,在‘other‘目錄下找出之前遺失的文件
然后新建'c.txt'文件胳赌,并將文件內(nèi)容復制過去,結(jié)束匙隔。
是不是很麻煩疑苫,特別是一次提交的文件多了,一個一個新建(修改)復制過去好煩哦纷责。
是的很煩捍掺,所以保持良好的習慣。永遠不要讓這種操作降臨到自己身上才是正道再膳。(這只是為不可控的意外情況準備的)