git reset --hard 操做後的數據恢復

在進行正文以前先簡單介紹下git reset 命令git

git reset

git reset 命令用於改變當前的倉庫狀態,簡單的場景用例:假設一次修改了兩個文件,然而須要對這兩個文件分別進行兩次提交,在進行緩存操做時(git add),不當心將兩個文件都進行了緩存,此時咱們須要對其中一個文件取消緩存,此時就須要git reset 操做來實現,以下圖 緩存

image
而後,對 b.txt進行 commit操做,而後再對 a.txt進行 add & commit操做

對於git reset命令添加了**--hard** 參數後會怎樣呢,在git官網的reference上 有以下一段話3d

也就是說,添加--hard參數後,會回到上次commit的狀態,也就是說從上次commit以後的的修改都將被重置,換句話說這些數據都丟失了,因此要謹慎操做哦。code

image

前置知識就到這裏了,開始今天的重點。cdn

當咱們進行了git reset --hard操做進行了版本回退,如今咱們又須要以前的修改信息,也就是說咱們須要版本回退以前的文件信息,此時我分了三種狀況blog

  1. 以前的修改進行了 commit 提交,也就是說咱們回退前的修改(曾經)存在於版本里;
  2. 以前的修改未進行commit提交,可是進行了 git add 操做;
  3. 以前的修改未進行 commit 提交,也未進行git add操做。

若是時第一種狀況,很簡單咱們拿到以前修改的commit的哈希值(或者說id),而後執行 git reset --hard [hash]就能夠回退到以前修改的狀態。 怎麼拿hash, 這個好說,能夠執行命令git reflog命令,它會顯示出你以前的全部操做 像這個get

image

62f039e 就是個人reflog提交的哈希值,對其進行reset便可hash

若是是第三種狀況,很差意思暫時尚未找回的辦法,若是你有歡迎拿出來你們交流it

今天的重點就是第二種狀況,畢竟曾經我也覺得此狀況無解,直到後來這邊文章誕生前。io

今天的主角命令 git fsck,這裏呢不具體講解此命令,只是簡單描述利用此命令進行文件恢復。

image

image

如圖示,我新建了文件c.txt並添加了內容 'git fsck',添加到緩存以後進行了reset操做, 此時由於沒有進行git commit操做因此沒有hash值,可供恢復,這個時候須要進行操做 git fsck --lost-found操做,返回以下結果:

image

關於此命令,git官網的解釋

image
根據提示,找到目錄'.git/lost-found',能夠看到,

image

咱們在‘commit’和‘other’目錄下分別看到命令窗口打印出的文件,在‘other‘目錄下找出以前遺失的文件

image
而後新建'c.txt'文件,並將文件內容複製過去,結束。

是否是很麻煩,特別是一次提交的文件多了,一個一個新建(修改)複製過去好煩哦。

是的很煩,因此保持良好的習慣。永遠不要讓這種操做降臨到本身身上纔是正道。(這只是爲不可控的意外狀況準備的)

相關文章
相關標籤/搜索