上篇介紹 git checkout 是還原檔案內容,那麼 git reset 的功能是什麼呢?
指令功能:還原「檔案狀態」
使用 git reset 指令之前,要先了解 reset 的意思。從英文翻譯來看 reset 代表的是重新設定,但其實在中文解釋裡「前往」、「變成」,會較符合該指令的用途,所以注意別被誤導囉!
👉 reset → go to / become
git reset
的基本觀念:
📖 常用情況:將已預存的檔案移出預存區
情境|假設今天修改兩份檔案,想要分別提交它們,卻不小心,卻不小心使用 git add *
將兩者都加至暫存區。如果想要把其中一個檔案移出預存區(unstage),我們可以怎麼做呢?
🛠 實際操作
分別新增兩個檔案,內容自由編輯
$ touch index1.html # 新增 index1.html 檔案
$ touch index2.html # 新增 index2.html 檔案
此時我誤用了 git add *
指令將兩個檔案都上傳,並查看狀態
$ git add * # 將所有檔案全部加至暫存區 ( * 代表全部)
$ git status # 檢查檔案狀態
檔案狀態顯示:Changes to be committed(new file)
可以看到兩個檔案都被加至暫存區,但這跟我本來想要分別 Commit 的預設不同,所以希望可以將其中一個移除暫存區。
紅色底線的文字訊息:use "git reset HEAD ..." to unstage
便是提示說使用 "git reset HEAD ..." 將檔案放回 unstage 。
輸入 git reset
指令,並查看狀態。
$ git reset HEAD index2.html # 還原 index2.html 檔案狀態(使檔案回到前一個狀態)
// git reset HEAD + [檔案名稱]
現在暫存區裡只有 index1.html 檔案,而 index2.html 的檔案狀態則變成未追蹤(Untracked files)的狀態。
將檔案提交至儲存區 git commit -m
只有 index1.html 檔案被提交啦!達到原本想做的效果了~
首先「絕對路徑」,是指你很清楚你要還原哪一個版本,知道 Commit 編號,那麼可以直接指定要還原那個版本檔案。
$ git reset [Commit 的 SHA-1 編號] # 還原指定的 Commit
相對路徑|
首先先使用 git log --online
指令來檢視目前的 Git 紀錄。
$ git log --online # 檢視 Git 紀錄(簡單一行形式)
上圖部分可以看到我們目前有三個 Commit 版本,而 HEAD 與 master 都剛好同時指向
3f2ed7a
這個版本。
假設今天想要還原到 a8bf179
這個版本,那麼有以下幾種方式,都是以「相對路徑」的概念進行。
^
符號代表「前一次」的意思。
因此 3f2ed7a^ 代表 3f2ed7a 的前一個。而因為 master 與 HEAD 也都剛好指向 3f2ed7a ,所以我們也可以使用 master 或 HEAD 來進行相對路徑的方式指定還原到哪個版本。
git reset HEAD <file>
根據 HEAD ( 最後提交的 patch ) 來還原 file 的「檔案狀態」。
參考文章:檔案還原
⚠️ 只會還原「檔案狀態」,而不是還原檔案的「內容」
file 是用來指定還原某檔案,如沒有指定何者檔案,則會默認為還原所有檔案。
$ git reset HEAD <file> # 還原「指定」的檔案狀態
$ git reset HEAD # 還原「全部」的檔案狀態
git reset
會改變檔案的檔案狀態,使用時機用於想要更改 master 或是暫存區的資料。但這裡要特別注意的是,如果對於 git reset 指令還不夠熟悉,最好別隨便使用,一旦 master 被移動,很容易很容易找不到原來的檔案。
建議使用時機:
git add
加到不想要的檔案,想從暫存區移除掉總結 |可以清除過去的紀錄,負責移動 HEAD 和 master 的指令。