回復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

results matching ""

    No results matching ""