Git Reference引用詳解

admin發表於2018-07-23

首先看一下當前提交歷史,程式碼如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201807/23/002937ts0kz69q0jdcgzj0.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上面程式碼其實是縮寫形式,可以使用如下兩種方式替代:

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

另外一種方式:

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

執行效果和第一種方式執行效果完全相同。很容易辨識,最後一種效果是最差的,因為sha-1值難以記憶。

所以考慮到sha-1值難以記憶和書寫,就可以使用一個名字簡單的檔案來記錄這個值,這樣我們就可以使用這個簡單的名字替代sha-1值,我們就可以稱這些檔案為引用,也可以叫做指標。

一.分支引用:

分支就是一種引用,.git目錄下的refs/heads目錄中存放的就是當前所有分支:

a:3:{s:3:\"pic\";s:43:\"portal/201807/23/003043obivaa1z86zj1a7i.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

檔案中儲存的就是對應commit提交的sha-1值,程式碼如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201807/23/003119mwsxxxaee4rwzg3p.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

關於分支更多內容可以參閱Git branch分支實質一章節。

二.HEAD引用:

關於HEAD更多內容參閱Git HEAD是什麼一章節。

HEAD是一種特殊的引用,通常情況下它執行一個分支。

a:3:{s:3:\"pic\";s:43:\"portal/201807/23/003159zajjeenvzajggjjz.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

當前處於master分支,下面來看一下HEAD中的內容,程式碼如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201807/23/003248y3ttthhyxs1msh1r.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

HEAD也有不指向分支的情況,具體參閱Git detached HEAD介紹一章節。

三.Tag引用:

關於Tag標籤的具體用法參閱git tag標籤用法詳解一章節。

標籤分為輕量級標籤和帶有附註的標籤,下面給當前提交打上兩個標籤:

輕量級標籤:

[Shell] 純文字檢視 複製程式碼
$ git tag tagLearn 68a5550

帶附註的標籤:

[Shell] 純文字檢視 複製程式碼
$ git tag annotatedTag f5c53c0 -a -m "螞蟻部落"

上面分別建立一個輕量級標籤和一個帶附註的標籤。

輕量級標籤是一個直接指向commit提交的引用,程式碼如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201807/23/003414fcwp4zd3c8p43vck.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

帶附註的標籤是一個物件,.git/refs/tags/中的引用首先會指向這個tag物件,程式碼如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201807/23/003455olj03ft0utu6b0qs.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

下面這串字元就是tag物件的sha-1值。

四.remote引用:

如果跟蹤一個遠端分支, Git會把最後一次推送到這個remote遠端伺服器的每個分支的值都記錄在 refs/remotes 目錄下。這些引用都指向遠端伺服器上的對應分支。

相關文章