回復GIT不同區域修改
本節指令
git reset
git rm --cached
git checkout
git reset --hard
瞭解了檔案狀態後,接著我們回到前面的問題:
假設我們在工作目錄(WD)、暫存區(Stage)或儲存庫(Repo)所做的修改
後悔
了!想要回到之前的狀態,怎麼辦咧?
先來看一下之前的三種區域圖:
【Ex-1 產生四種類型檔案】
a.txt:已提交(Committed)
b.txt:已更改(Changes not staged for commit)
c.txt:等待提交(Changes to be committed)
d.txt:未追蹤(Untracked files)
mkdir test3
cd test3
git init
echo 1 > a.txt
echo 1 > b.txt
echo 1 > c.txt
echo 1 > d.txt
git add a.txt
git add b.txt
git add c.txt
git commit a.txt -m "add a.txt"
git commit b.txt -m "add b.txt"
echo 2 > b.txt
接著要來講解重頭戲囉!
一、將檔案從工作目錄(WD)移除
現在工作目錄有b.txt和d.txt兩個檔案,若要將未追蹤(Untracked files)
的檔案d.txt(實體)移除,可下rm
指令(不用加git喔):
rm d.txt
git status
其實直接從資料夾刪除也可以喔!
二、將檔案從暫存區(Stage)返回工作目錄(WD)
現在我要將c.txt返回工作目錄,只要下reset
指令
git reset
另解:
git rm --cached c.txt
此時c.txt的狀態由等待提交(Changes to be committed)
改成未追蹤(Untracked files)
狀態。只是改變狀態,並不會
把實體檔案刪除喔!
三、將檔案從儲存庫(Repo)返回暫存區(Stage)
沒…沒有這個指令啊,大哥…
四、將檔案從儲存庫(Repo)返回工作目錄(WD)
由於放置到儲存庫的檔案已經是提交的版本了,所以若要將以前的版本內的檔案狀態回到工作目錄(WD),通常在進行分支(branch)切換時才用的到,使用指令是checkout
,例如要切換到feature分支,可寫成:
git checkout feature
切換至feature分支後,工作目錄的所有檔案,就會改成feature分支最新版本的檔案內容,如此也算是將檔案從儲存庫返回工作目錄了
由於分支(branch)還沒教到,因此checkout
指令之後單元再做解說。
所以要將檔案從儲存庫返回暫存區,其實就是在做切換版本
的動作,將某個版本當時的檔案狀態全部復原到工作目錄裡。
那我們現在還沒有其他分支,無法下checkout
來切換,怎麼辦呢?
如果你真的真的受不了,想要回去之前版本,就用reset
吧!
以這個範例,我們可以試試回到最初第一個提交(commit)版本,如果忘了,先下log
指令查看看:
git log
查看後可以看到一堆SHA1碼,你可以想成是每個提交(commit)版本的唯一ID,這是一個16進位值,共40字元,我們只要打前6碼就可以了(除非你的專案太大,才要增加碼數),指令如下:
git reset --hard f56ac9
請注意後面的f56ac9
要打上自己的commit ID。另外--hard
表示強制
將檔案全部換成f56ac9
版本的檔案。
完成後,開啟資料夾可以看到檔案回復到最初第一個版本的狀態,也就是只有一個a.txt檔
1