Git HEAD詳解

admin發表於2018-07-16

很多Git使用者對HEAD有所瞭解,但僅限於它指向當前所在的分支。

本文將較為詳細深入的介紹一下HEAD到底是什麼。

首先看一下當前分支的提交記錄,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git log --oneline

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/004514ilqjlt3l8lprqlq3.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

由上圖可以看到HEAD指向master分支,master分支指向sha-1值為93dd8e(縮寫)的commit提交。

下面看一個更為形象的圖示:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/004539mxd5cdkdrobexvbc.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

一.HEAD是什麼:

HEAD是一個指標,通常情況下它可以將它與當前分支等同(其實它是指向當前分支)。

.git目錄中有一個為HEAD的檔案,它記錄著HEAD的內容,檢視其中內容程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ cat .git/HEAD

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/004636rkkolilk4ker9bbi.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到HEAD指向master分支,下面再來看一下refs/heads/master中的內容:

[Shell] 純文字檢視 複製程式碼
$ cat .git/refs/heads/master

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/004741nifrg9czmfikcz5q.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

master分支也只是一個存放40位sha-1值的檔案而已,正是當前分支所指向commit的sha-1值。

二.切換分支:

當前位於master,現在切換到Develop分支,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git checkout Develop

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/004949pmsjjsrc5stts3ne.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到現在已經切換到分支Develop。

現在再來檢視HEAD檔案的內容,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ cat .git/HEAD

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/005054qfvm4w19zdv8v82g.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

現在已經指向Develop分支。

下面再來看一下refs/heads/Develop中的內容:

[Shell] 純文字檢視 複製程式碼
$ cat .git/refs/heads/Develop

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/16/005149iy2tqizjkj75zt2i.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

也就是說HEAD通常會指向當前所在分支。

三.detached HEAD:

當HEAD沒有指向某個分支,而是指向一個commit,則會形成detached HEAD。

此概念會在單獨一章節介紹,具體參閱Git detached HEAD介紹一章節。

四.HEAD縮寫形式:

Git 1.8.5版本之後,HEAD有一個縮寫形式@,確實可以省略幾個字元。

[Shell] 純文字檢視 複製程式碼
$ git reset HEAD^

上面程式碼可以縮寫為以下形式:

[Shell] 純文字檢視 複製程式碼
$ git reset @^

雖然是少些了幾個字元,但是總感覺不能夠見詞達意,好像失去了一點什麼。