iT邦幫忙

2021 iThome 鐵人賽

DAY 14
2
Modern Web

【Git】從零開始學習 Git - 30 天的學習筆記系列 第 14

Day14|【Git】檔案管理 - 檔案還原 git reset

上篇介紹 git checkout 是還原檔案內容,那麼 git reset 的功能是什麼呢?


git reset

指令功能:還原「檔案狀態

使用 git reset 指令之前,要先了解 reset 的意思。從英文翻譯來看 reset 代表的是重新設定,但其實在中文解釋裡「前往」、「變成」,會較符合該指令的用途,所以注意別被誤導囉!

👉 reset → go to / become

git reset 的基本觀念:

  1. 常搭配參數使用。常見的三種參數:mixed 、 soft 、 hard
  2. 有「相對」與「絕對」的做法
  3. 與檔案狀態有關,操作此指令並不是代表把原本的 Commit 移除,而是前往到某次的 Commit 狀態。

📖 常用情況:將已預存的檔案移出預存區

情境|假設今天修改兩份檔案,想要分別提交它們,卻不小心,卻不小心使用 git add * 將兩者都加至暫存區。如果想要把其中一個檔案移出預存區(unstage),我們可以怎麼做呢?

🛠 實際操作

  1. 分別新增兩個檔案,內容自由編輯

    $ touch index1.html # 新增 index1.html 檔案
    $ touch index2.html # 新增 index2.html 檔案
    

    https://ithelp.ithome.com.tw/upload/images/20210928/201410100W4TcdtshM.png

  2. 此時我誤用了 git add * 指令將兩個檔案都上傳,並查看狀態

    $ git add * # 將所有檔案全部加至暫存區 ( * 代表全部)
    $ git status # 檢查檔案狀態
    

    https://ithelp.ithome.com.tw/upload/images/20210928/20141010FFGvo9zDy5.png

    檔案狀態顯示:Changes to be committed(new file)可以看到兩個檔案都被加至暫存區,但這跟我本來想要分別 Commit 的預設不同,所以希望可以將其中一個移除暫存區。

    紅色底線的文字訊息:use "git reset HEAD ..." to unstage

    便是提示說使用 "git reset HEAD ..." 將檔案放回 unstage 。

  3. 輸入 git reset 指令,並查看狀態。

    $ git reset HEAD index2.html # 還原 index2.html 檔案狀態(使檔案回到前一個狀態)
    // git reset HEAD + [檔案名稱]
    

    https://ithelp.ithome.com.tw/upload/images/20210928/20141010jNX20YjEbw.png

    現在暫存區裡只有 index1.html 檔案,而 index2.html 的檔案狀態則變成未追蹤(Untracked files)的狀態。

  4. 將檔案提交至儲存區 git commit -m

    https://ithelp.ithome.com.tw/upload/images/20210928/20141010KLxziLVHz1.png

    只有 index1.html 檔案被提交啦!達到原本想做的效果了~


# 相對路徑 / 絕對路徑

首先「絕對路徑」,是指你很清楚你要還原哪一個版本,知道 Commit 編號,那麼可以直接指定要還原那個版本檔案。

$ git reset [Commit 的 SHA-1 編號] # 還原指定的 Commit

相對路徑

首先先使用 git log --online 指令來檢視目前的 Git 紀錄。

$ git log --online # 檢視 Git 紀錄(簡單一行形式)

https://ithelp.ithome.com.tw/upload/images/20210928/20141010L3r3ECXAex.png

上圖部分可以看到我們目前有三個 Commit 版本,而 HEAD 與 master 都剛好同時指向 3f2ed7a 這個版本。

假設今天想要還原到 a8bf179 這個版本,那麼有以下幾種方式,都是以「相對路徑」的概念進行。

  • git reset 3f2ed7a^
  • git reset master^
  • git reset HEAD^

^ 符號代表「前一次」的意思。

因此 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 被移動,很容易很容易找不到原來的檔案。

建議使用時機:

  1. git add 加到不想要的檔案,想從暫存區移除掉
  2. 已經 Commit 後的檔案,發現有地方想修改或者有問題要修改

總結 |可以清除過去的紀錄,負責移動 HEAD 和 master 的指令。


上一篇
Day13|【Git】檔案管理 - 檔案還原 git checkout
下一篇
Day15|【Git】git reset 補充 - 三種模式
系列文
【Git】從零開始學習 Git - 30 天的學習筆記30

尚未有邦友留言

立即登入留言