還原遺失的 Git Commit

前言:

在 Git 裡頻繁且大量的新增或刪除 Commit 是常有的事,也難免會有些疏失,如果是不小心加入不相關的 Commit,還算是好解決,但萬一不小心刪除,或是不小心遺失了某個重要的 Commit,該怎麼辦呢?除了重新上一個內容一樣的 Commit之外,有沒有其他補救方法呢?

前情提要:

我們先依照下列步驟製造出一個類似的場景
$ touch abc.txt
$ vim abc.txt    ==>  加入字串 defdef
$ git add .
$ git commit -m "defdef"
$ vim abc.txt    ==>  加入字串 ghighi
$ git add .
$ git commit -m "ghighi"

接著我們將捨棄最新的一個 Commit,並將修改還原為上一個 Commit 的狀態
$ git reset HEAD~    ==>  捨棄最新一個 Commit
$ git checkout -- abc.txt    ==>  取消修改


如上圖所示,此時的 abc.txt 裡面沒有字串"ghighi",如果我們想再一次加入字串"ghighi",或者說我想更精準的要求,必須找回剛剛捨棄的那個 Commit 並且將它還原呢?

Git Reflog:

答案是使用 git reflog 指令,其實大部分透過 Git 指令的操作,都會紀錄在本地端的倉庫裡,其中包含了 Commit 歷史紀錄,因此 git reflog 非常適用於現在的情況,它會列出本地端目前紀錄過的 Commit,從中找到你想還原的 Commit,透過 Reset 或 Cherry-Pick 將其還原即可!
$ git reflog    ==>  找到欲還原的 Commit ID
$ git reset --hard <commit-id>   
or git cherry-pick <commit-id>


按照上面步驟完成之後,就可以看到剛剛捨棄的 Commit 已經被復原,同時檔案也回復到有字串"ghighi"的狀態囉!

參考資料:
[StackOverflow]How can I recover a lost commit in Git?

留言

這個網誌中的熱門文章

程式語言常用之符號與詞彙 - 中英文對照

什麼是 Bootloader?

Repo 實用指令