有時候會手滑不小心刪除了某些檔案或資料夾,
或者刪除後才發現還是留下來比較好,這些狀況就是我們為什麼要用版控軟體的其中一個原因。
還記得我們之前在刪除檔案後使用退版的方式回到檔案還沒被刪的狀態吧。
但如果刪除了還沒提交到儲存庫的話,是有辦法可以直接把他們救回來的。
我們先來把所有附檔名是 txt 的檔案全部刪掉
這邊再提醒一下,使用檔案管理刪檔案也是一樣的。
# 看一下目前工作目錄有什麼檔案
$ ls
hello.txt log.txt look look.txt test.py
# 刪掉所有附檔名為 txt 的檔案
$ rm *.txt
# 確認一下都刪掉了
$ ls
look test.py
# 看一下狀態
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: hello.txt
deleted: log.txt
deleted: look.txt
no changes added to commit (use "git add" and/or "git commit -a")
看得出來有三個檔案被刪了。
使用 checkout
可以救回檔案,我們救回 hello.txt
$ git checkout hello.txt
Updated 1 path from the index
$ ls
hello.txt look test.py
跟 add 一樣,可以使用 .
就可以救回所有的檔案,範圍限於還沒提交的這段期間,
也就是我們看狀態時看到的那些被標紀刪除的檔案。
$ git checkout .
Updated 2 paths from the index
$ ls
hello.txt log.txt look look.txt test.py
如果是被修改過的檔案後悔了,也是可以這樣做,他會回復到最近一次 commit 的狀態。
所以,如果還沒提交前,有檔案被刪或被修改,使用 .
的話會把那些異動的檔案全部變回之前提交的狀態,
就像什麼事都沒做一樣。
我們經常提醒大家要看紀錄或狀態,就是避免不知道目前的狀態或誤解指令的意思而弄錯,
當然有 git 紀錄在原則上都可以整救,只是複不複雜的問題而已。
原理就是 git 會到暫存區去把檔案複製一份回來蓋掉現有工作目錄下的檔案,同時暫存區的紀錄也會改變。
git checkout HEAD~2 hello.txt
就是讓 hello.txt 內容回到兩個 commit 前的狀態。
那如果刪除或更改的狀況又已經提交了該怎麼救回來呢?請看下篇。