iT邦幫忙

2021 iThome 鐵人賽

DAY 16
1

在先前的章節裡,我們可以常看見 HEAD 這個名詞,它指的是什麼呢?

// git 恢復文件到初始狀態
$ git reset HEAD <file>

// git 展示提交命令
$ git log
commit c4f9d71863ab78cfca754c78e9f0f2bf66a2bd77 (HEAD -> master)
(SHA-1 記得改成自己的)

這篇就讓我們好好了解 HEAD 吧!


什麼是 HEAD ?

HEAD 指的是一個指標,指向當前所在的分支 。

分支其實是個指向 commit 對象的指針,用來記錄不同的工作變動,如 masterdevelop 分支,因此我們如何知道當前是在哪個分支上操作的呢?

其實就是使用 HEAD 檔案來記錄的哦!HEAD 是一個特別指針,在 Git 中,指向你正在工作中的本地分支的指針,因此通常我們也可以把 HEAD 看作 「目前所在分支」,也就是當前分支的別名。

https://ithelp.ithome.com.tw/upload/images/20210930/20141010u0Ablk8NRi.png

.git 目錄裡可以找到 HEAD 檔案。

HEAD 檔案裡面是什麼呢?我們可以輸入指令來查看。

$ cat .git/HEAD  # 顯示 .git 目錄裡的 HEAD 檔案內容
//cat <file>  是 Linux 檔案管理指令

https://ithelp.ithome.com.tw/upload/images/20210930/20141010PUoLmjn61f.png

得到的回饋是:ref: refs/heads/master

ref 同 References ,「引用」之意。從回饋的訊息中,可以看出目前 HEAD 正指向某個分支,我們可以繼續查看 refs/heads/master 的內容。

$ cat .git/refs/heads/master # 顯示 .git/refs/heads/master 的內容

https://ithelp.ithome.com.tw/upload/images/20210930/201410100uPHlpeFNP.png

回饋顯示:f926dd97ae8a3c25176d8ce1268c37a8d8753eb3

這 40 個字元代表的是什麼呢?是 SHA-1 值,每一次提交一個版本就會有代表的 SHA-1 值。

以上輸入指令的步驟,我們也可從畫面中查看。

  1. 找到 .git 目錄下的 HEAD 檔案

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010Ha747vxSqe.png

  2. 點開 HEAD 檔案顯示內容

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010AWjU0tsAO6.png

  3. 根據內容找到 refs 目錄,並持續打開裡面的內容,找到 master 檔案

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010t2W8qmNv6q.png

  4. 點開 master 檔案,查看內容

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010t42azFHl53.png


HEAD 指向範例

上面我們有提到 HEAD 檔案用來記錄我們當前的分支在哪裡,那接下來我們就透過實際操作看看 HEAD 的指向吧。

HEAD 可以選擇指向到:

  1. 分支(Branch)

  2. commit 版本

  3. 輸入以下指令,完成提交動作

    // 在 git_practice 資料夾底下
    $ mkdir project # 新建一個 project 目錄
    $ cd project # 將工作目錄切換到 project 目錄
    $ git init # 在 project 目錄中建立數據庫
    $ touch hello.html # 建立一個 hello.html 檔案
    $ git add . # 將檔案加至暫存區
    $ git status # 檢查狀態(也可略過)
    $ git commit -m"訊息記錄" # 提交至儲存庫,新增一次 commit 版本
    

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010bhbWuxkbag.png

  4. 輸入 git branch 指令,瀏覽目前分支指向

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010rG7UqTROmu.png

    按 q 鍵可退出

    回饋顯示: * master

    * 代表目前在這個分支上面。master 為目前新增的分支( master 就是我們的預設分支名稱)。因此我們可以知道目前在 master 這個分支上。

  5. 查看版本 git log 指令

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010a9GpLzNtha.png

    因為目前我們只提交一次 commit ,因此只有一次的版本紀錄。

    此時 HEAD - master - commit 的關係圖為:

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010srA4Z6QpPU.png


假設我們今天又多做了幾次修改,並 commit 提交版本紀錄

https://ithelp.ithome.com.tw/upload/images/20210930/20141010yzdjPUYZWO.png

使用 git log 指令查看歷史紀錄

https://ithelp.ithome.com.tw/upload/images/20210930/20141010cegkzwfzEH.png

回饋顯示我們總共提交了四個 commit ,而 HEAD 指向最後一次的版本,這代表 HEAD 會隨著我們每一次新增 Commit 時,都指向最新的版本分支。(HEAD -> master)

注意:歷史紀錄是最近期的放在最上面,時間由遠到近排列為由下而上

此時 HEAD - master - commit 的關係圖為:

https://ithelp.ithome.com.tw/upload/images/20210930/201410102pqO46lSO0.png

https://ithelp.ithome.com.tw/upload/images/20210930/201410109GNP0T8JR7.png

狀況題|想查看最初的版本

方法:可以透過 HEAD 來指向指定的 commit 版本。

🛠 實際操作

  1. 使用 git log 指令查看歷史紀錄時,我們可以查到最初的版本(版本一)的 SHA-1 編號。

    https://ithelp.ithome.com.tw/upload/images/20210930/201410100Ce88eeOMe.png

    版本一的 SHA-1 編號前四碼為: 0076

  2. 使用 git checkout 指令,切換到指定 commit 版本

    $ git checkout SHA-1編號前四碼(識別碼) #切換到指定版本
    

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010fW9W7hsFM4.png

    版本切換到最初的版本囉!

    我們可以從工作目錄看一下變化:

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010pWSsTjyk9v.png

    https://ithelp.ithome.com.tw/upload/images/20210930/201410103Wu4SrPIsB.png

    補充:即使回到舊的 commit 版本,其他的版本不會因此而不見喔!

狀況題|如果想將版本切回現在(最新)的版本呢?

方法:使用 git checkout master 指令

https://ithelp.ithome.com.tw/upload/images/20210930/20141010che62cN2cG.png

輸入指令後,重新指向了 master 分支,工作目錄中的畫面也是當初最後步驟的樣子。


上述狀況題,我們使用 SHA-1 編碼切換到指定版本,其實也可以透過以 HEAD 為起點,跟它相距的版本唷!

各版本之間以 HEAD 為基準點,其他版本的相對位置:

https://ithelp.ithome.com.tw/upload/images/20210930/20141010uTN2vhwGTl.png

^ 符號表示「前一次」,^^ 代表往前兩次。~3 盜號加數字可以直接往前推指定數字次數。

使用 HEAD 相對位置來切換版本

$ git checkout HEAD~3 # 切換到三次前的版本

https://ithelp.ithome.com.tw/upload/images/20210930/20141010Yq6eXVG6ww.png

可以看到結果跟上面一樣,切換到版本一囉!

因此如果要切回現在(最新版本)的話,一樣要輸入git checkout master 指令。

https://ithelp.ithome.com.tw/upload/images/20210930/20141010y0Zvbgspzt.png


上一篇
Day15|【Git】git reset 補充 - 三種模式
下一篇
Day17|【Git】存在 .git 目錄裡的東西 - Blob 物件與 Tree 物件(上)
系列文
【Git】從零開始學習 Git - 30 天的學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言