在進行正文之前先簡單介紹下git reset
命令
git reset
git reset
命令用於改變當前的倉庫狀態,簡單的場景用例:假設一次修改了兩個檔案,然而需要對這兩個檔案分別進行兩次提交,在進行快取操作時(git add
),不小心將兩個檔案都進行了快取,此時我們需要對其中一個檔案取消快取,此時就需要git reset
操作來實現,如下圖
![image](https://i.iter01.com/images/86cbd212ada061d65748798b5b40756a1f2e919a4cad2d4612c4b6015b0a1aac.png)
b.txt
進行commit
操作,然後再對a.txt
進行add & commit
操作
對於git reset
命令新增了**--hard** 引數後會怎樣呢,在git官網的reference上 有如下一段話
也就是說,新增--hard
引數後,會回到上次commit
的狀態,也就是說從上次commit
之後的的修改都將被重置,換句話說這些資料都丟失了,所以要謹慎操作哦。
![image](https://i.iter01.com/images/92ef22f76a36acba095e29bc6402aad639f185096b0236c089951b40107b3879.png)
前置知識就到這裡了,開始今天的重點。
當我們進行了git reset --hard
操作進行了版本回退,現在我們又需要之前的修改資訊,也就是說我們需要版本回退之前的檔案資訊,此時我分了三種情況
- 之前的修改進行了
commit
提交,也就是說我們回退前的修改(曾經)存在於版本里; - 之前的修改未進行
commit
提交,但是進行了git add
操作; - 之前的修改未進行
commit
提交,也未進行git add
操作。
如果時第一種情況,很簡單我們拿到之前修改的commit
的雜湊值(或者說id),然後執行 git reset --hard [hash]
就可以回退到之前修改的狀態。
怎麼拿hash
, 這個好說,可以執行命令git reflog
命令,它會顯示出你之前的所有操作
像這個
![image](https://i.iter01.com/images/0be6380134e59a271659437b6985e64d34115005a92faa18da1bbb302108a6ad.png)
62f039e
就是我的reflog
提交的雜湊值,對其進行reset
即可
如果是第三種情況,不好意思暫時還沒有找回的辦法,如果你有歡迎拿出來大家交流
今天的重點就是第二種情況,畢竟曾經我也以為此情況無解,直到後來這邊文章誕生前。
今天的主角命令 git fsck
,這裡呢不具體講解此命令,只是簡單描述利用此命令進行檔案恢復。
![image](https://i.iter01.com/images/c922bcb0c76d09b47dadc852daed99eee46b9431dc114fa890141c9439a48d88.png)
![image](https://i.iter01.com/images/ace002adc6ca52ce1099f9befc60ae57a59dd732438b36871b28dd7d83bbcb49.png)
如圖示,我新建了檔案c.txt
並新增了內容 'git fsck',新增到快取之後進行了reset
操作, 此時因為沒有進行git commit
操作所以沒有hash值,可供恢復,這個時候需要進行操作 git fsck --lost-found
操作,返回如下結果:
![image](https://i.iter01.com/images/71e6f7428cd5179ba7757a080b5faa3360fe3d6099fd049b738211c9c1838997.png)
關於此命令,git官網的解釋
![image](https://i.iter01.com/images/3394a569f5e13c85b33b4ca90b13250b1bec90e059163898e201fa1125930308.png)
![image](https://i.iter01.com/images/e0066e4db62658142f5c5b90095c8ea84fe7d09c5ba88177940a6fde04ff2c49.png)
我們在‘commit’和‘other’目錄下分別看到命令視窗列印出的檔案,在‘other‘目錄下找出之前遺失的檔案
![image](https://i.iter01.com/images/0fc813c88af1fbe86bb4523abeb60de2b213fa775e7b88c69a5dc2309d76f8ce.png)
是不是很麻煩,特別是一次提交的檔案多了,一個一個新建(修改)複製過去好煩哦。
是的很煩,所以保持良好的習慣。永遠不要讓這種操作降臨到自己身上才是正道。(這只是為不可控的意外情況準備的)