Git找回回滾後的內容和刪除的文件

本文首發於公衆號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

如果我已經執行了git reset --hard XXX,之前的commit的內容還能找回來嗎?

首先,經過之前的學習,我們起碼知道,執行完 reset回滾commit以後,之前的commit其實沒有被刪除,肯定還在的。

要找回之前的 commit 的內容,那我們勢必得知道對應的commit 的SHA-1值吧,這個時候用git log是看不到的。

之前我們曾經提到過,就是 .git目錄下有一個 logs 目錄,裏面記錄了所有HEAD改變的記錄,包括分支操作(新建、切換等),commit操作(新commit,reset等)。那我們之前 reset 也是更改了HEAD,所以這裏面肯定會有我們的記錄。可以用下面的方法拿到:

//是的,你沒看錯,加個 -g 參數就看得到了
git log -g
//或者是下面的命令
git reflog

拿到之前的 commit信息之後,我們就能找回對應的提交記錄了

//可以新建一個分支指向對應的提交
git branch branchName commitId

找回刪除的文件

上面 撤銷add 一節中我們用的命令並不會刪除工作目錄中的文件,但是萬一你一不小心漏掉了 --cached 參數,那效果就不一樣了,會把工作目錄和暫存區中的文件記錄都會刪除。

可以從垃圾桶裏面還原出來嗎?

rm 這個命令是linux命令,文件一旦通過 rm 命令刪除,則無法恢復。比如:

//這樣執行刪除,new.txt不會出現在垃圾桶
rm new.txt

要想知道刪除的文件能不能找回來,我們先得明白我們的文件信息存在於哪些地方。主要是3個:

  • 工作目錄
  • 暫存區也可能有,如果之前 add 過,並且沒有做過刪除暫存區的操作的話
  • commit信息中,這裏如果之前提交過則肯定是有的,而且一般是刪除不掉的

如果我們前面是通過上面的 rm 命令刪除了工作目錄的文件,那我們可以從暫存區裏面把文件恢復出來:

git checkout -- new.txt

如果我們是一開頭的那種情況,用 git rm 命令,就會把暫存區和工作區都刪除了,那還可以從最近的 commit 中恢復(當然前提是你之前已經提交過了):

git checkout HEAD readme.txt

所以綜上,還是推薦大家儘量不要用帶有 rm 的命令,撤銷 add 操作用 reset 命令。

reset 命令操作的都是跟 commit 相關的,比如把分支重置到某次 commit,把某些文件重置到某次 commit對應的文件版本等。

同時,如果不知道怎麼操作,可以用 git status 命令,它會提示一些操作:

//在 add 之後執行
git status
//輸出
On branch master
Changes to be committed:
    //這句就是提示我們,如果後悔add了,可以用下面的 reset命令
  (use "git reset HEAD <file>..." to unstage)

    modified:   myTest.txt


                         歡迎關注我的公衆號查看更多精彩文章!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章