Git branch分支實質

admin發表於2018-08-07

關於如何建立分支可以參閱Git新建分支一章節。

經過若干次提交之後,分支圖示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/07/000953w1m2awlll272ou21.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

關於上圖,我們可以這樣解釋:

(1).具有一個master分支。

(2).master分支具有三個commit提交物件。

(3).C1、C2和C3都是commit提交物件,除第一個之外,其他物件都有一個或多個指向上次提交物件的指標。

解析分支本質:

分支名稱master是什麼呢,它本質上是一個可變指標,指向最後一個commit提交,隨著commit提交的變化,master的指向位置也在不斷變化。下面再新增一個提交C4,圖示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/07/001018xpfmm9p0impv9xsr.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

我們可以形象的將master分支名稱看做一個生活中的標籤(不能等同於git中的tag),貼在了某個commit物件上,然後從這個commit物件回溯,就形成了一個完整的分支。下面新建一個issue5分支,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git branch issue5

再來檢視提交歷史,程式碼如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201808/07/001121q2klbb8hz0b77jhi.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到在903d5af物件被兩個分支(master和issue5)指向,因為issue5是基於master分支新建的。

圖示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/07/001141v99emcnn95h7z07h.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

在.git目錄下的refs/heads目錄中存放的就是當前所有分支。

圖示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/07/001206kzdy9gydd7prh597.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

檢視一下其中的內容,程式碼如下:

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

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

a:3:{s:3:\"pic\";s:43:\"portal/201808/07/001242wr29m82gftt1x8ro.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到master檔案中儲存的是最後一次提交的sha-1值,也就是master正指向這個commit提交。

這也是為什麼Git可以瞬間建立分支,成本極低的原因,僅僅建立一個檔案,然後寫入一段字串,效率豈能低。

下面將issue5改名為newBr,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ mv .git/refs/heads/issue5.git/refs/heads/newBr

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

a:3:{s:3:\"pic\";s:43:\"portal/201808/07/001320grofyn2n0lzf1rlq.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

相關文章