在先前的章節裡,我們可以常看見 HEAD 這個名詞,它指的是什麼呢?
// git 恢復文件到初始狀態
$ git reset HEAD <file>
// git 展示提交命令
$ git log
commit c4f9d71863ab78cfca754c78e9f0f2bf66a2bd77 (HEAD -> master)
(SHA-1 記得改成自己的)
這篇就讓我們好好了解 HEAD 吧!
HEAD 指的是一個指標,指向當前所在的分支 。
分支其實是個指向 commit 對象的指針,用來記錄不同的工作變動,如 master
、 develop
分支,因此我們如何知道當前是在哪個分支上操作的呢?
其實就是使用 HEAD 檔案來記錄的哦!HEAD 是一個特別指針,在 Git 中,指向你正在工作中的本地分支的指針,因此通常我們也可以把 HEAD 看作 「目前所在分支」,也就是當前分支的別名。
在 .git 目錄裡可以找到 HEAD 檔案。
HEAD 檔案裡面是什麼呢?我們可以輸入指令來查看。
$ cat .git/HEAD # 顯示 .git 目錄裡的 HEAD 檔案內容
//cat <file> 是 Linux 檔案管理指令
得到的回饋是:ref: refs/heads/master
ref 同 References ,「引用」之意。從回饋的訊息中,可以看出目前 HEAD 正指向某個分支,我們可以繼續查看 refs/heads/master 的內容。
$ cat .git/refs/heads/master # 顯示 .git/refs/heads/master 的內容
回饋顯示:f926dd97ae8a3c25176d8ce1268c37a8d8753eb3
這 40 個字元代表的是什麼呢?是 SHA-1 值,每一次提交一個版本就會有代表的 SHA-1 值。
以上輸入指令的步驟,我們也可從畫面中查看。
找到 .git 目錄下的 HEAD 檔案
點開 HEAD 檔案顯示內容
根據內容找到 refs 目錄,並持續打開裡面的內容,找到 master 檔案
點開 master 檔案,查看內容
上面我們有提到 HEAD 檔案用來記錄我們當前的分支在哪裡,那接下來我們就透過實際操作看看 HEAD 的指向吧。
HEAD 可以選擇指向到:
分支(Branch)
commit 版本
輸入以下指令,完成提交動作
// 在 git_practice 資料夾底下
$ mkdir project # 新建一個 project 目錄
$ cd project # 將工作目錄切換到 project 目錄
$ git init # 在 project 目錄中建立數據庫
$ touch hello.html # 建立一個 hello.html 檔案
$ git add . # 將檔案加至暫存區
$ git status # 檢查狀態(也可略過)
$ git commit -m"訊息記錄" # 提交至儲存庫,新增一次 commit 版本
輸入 git branch
指令,瀏覽目前分支指向
按 q 鍵可退出
回饋顯示: * master
*
代表目前在這個分支上面。master
為目前新增的分支( master 就是我們的預設分支名稱)。因此我們可以知道目前在 master 這個分支上。
查看版本 git log
指令
因為目前我們只提交一次 commit ,因此只有一次的版本紀錄。
此時 HEAD - master - commit 的關係圖為:
假設我們今天又多做了幾次修改,並 commit 提交版本紀錄
使用 git log
指令查看歷史紀錄
回饋顯示我們總共提交了四個 commit ,而 HEAD 指向最後一次的版本,這代表 HEAD 會隨著我們每一次新增 Commit 時,都指向最新的版本分支。(HEAD -> master)
注意:歷史紀錄是最近期的放在最上面,時間由遠到近排列為由下而上。
此時 HEAD - master - commit 的關係圖為:
狀況題|想查看最初的版本
方法:可以透過 HEAD 來指向指定的 commit 版本。
🛠 實際操作
使用 git log 指令查看歷史紀錄時,我們可以查到最初的版本(版本一)的 SHA-1 編號。
版本一的 SHA-1 編號前四碼為: 0076
使用 git checkout
指令,切換到指定 commit 版本
$ git checkout SHA-1編號前四碼(識別碼) #切換到指定版本
版本切換到最初的版本囉!
我們可以從工作目錄看一下變化:
補充:即使回到舊的 commit 版本,其他的版本不會因此而不見喔!
狀況題|如果想將版本切回現在(最新)的版本呢?
方法:使用 git checkout master
指令
輸入指令後,重新指向了 master 分支,工作目錄中的畫面也是當初最後步驟的樣子。
上述狀況題,我們使用 SHA-1 編碼切換到指定版本,其實也可以透過以 HEAD 為起點,跟它相距的版本唷!
各版本之間以 HEAD 為基準點,其他版本的相對位置:
^
符號表示「前一次」,^^
代表往前兩次。~3
盜號加數字可以直接往前推指定數字次數。
使用 HEAD 相對位置來切換版本
$ git checkout HEAD~3 # 切換到三次前的版本
可以看到結果跟上面一樣,切換到版本一囉!
因此如果要切回現在(最新版本)的話,一樣要輸入git checkout master
指令。