本文首發於公衆號“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
歡迎關注我的公衆號查看更多精彩文章!