參考于https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E4%BD%95%E8%B0%93%E5%88%86%E6%94%AF
分支:Git 中的分支,其實本質(zhì)上僅僅是個指向 commit 對象的可變指針。
Git 會使用 master 作為分支的默認(rèn)名字。在若干次提交后,你其實已經(jīng)有了一個指向最后一次提交對象的 master 分支,它在每次提交的時候都會自動向前移動。
我們可以使用** git branch branch-name**來創(chuàng)建分支,例如我們創(chuàng)建一個叫testing 的分支:
git branch testing
此時我們只是創(chuàng)建了一個新的分支,并沒有切換過去,所以我們還在master分支上。那Git是如何知道我們在哪個分支上的呢?因為Git中有個專門指向分支指針的指針:HEAD。
那么我們?nèi)绾吻袚Q分支呢?使用**checkout **,我們來切換到testing 分支
checkout testing
這樣 HEAD 就指向了 testing 分支:
如何查看當(dāng)前有多少分支呢?
可以使用:git branch
frc@frc:~/GitHub/study/GitStudy$ git branch
* master
testing
我們可以看到現(xiàn)在有兩個分支,而master分支前有個*****號,它是告訴我們這是當(dāng)前所在分支,即HEAD指向的分支,我切換到testing分支再看看
frc@frc:~/GitHub/study/GitStudy$ git checkout testing
切換到分支 'testing'
frc@frc:~/GitHub/study/GitStudy$ git branch
master
* testing
我們發(fā)現(xiàn)*****跑到testing前面區(qū)了,說明現(xiàn)在在testing分支上。
此時如果我們?nèi)?git/目錄下會發(fā)現(xiàn)多了2個文件:
logs/refs/heads/testing
refs/heads/testing
看下logs/refs/heads/testing:
0000000000000000000000000000000000000000 ce97d3ee3e85989f86e655c81a3d4d6a17461dfa fengrongcheng <fengrongcheng2017@outlook.com> 1497510595 +0800 branch: Created from master
refs/heads/testing:
ce97d3ee3e85989f86e655c81a3d4d6a17461dfa
此時里面還有個文件發(fā)生了改變:HEAD,因為現(xiàn)在HEAD指向的是testing了:
ref: refs/heads/testing
原來應(yīng)該是:
ref: refs/heads/master
我們現(xiàn)在在testing分支上添加個提交看看會怎樣。
我們會看到testing分支領(lǐng)先master分支了,二期每次提交后HEAD都隨分支向前移動。
現(xiàn)在切回master分支:
此時把HEAD指針移回了master分支了,同時把工作目錄的內(nèi)容換成了master分支所指向的快照內(nèi)容。
現(xiàn)在如果我們在master上再添加個提交,就會變成這樣:
由于 Git 中的分支實際上僅是一個包含所指對象校驗和(40 個字符長度 SHA-1 字串)的文件,所以創(chuàng)建和銷毀一個分支就變得非常廉價。說白了,新建一個分支就是向一個文件寫入 41 個字節(jié)(外加一個換行符)那么簡單,當(dāng)然也就很快了。就是上面說道的:
refs/heads/testing:
ce97d3ee3e85989f86e655c81a3d4d6a17461dfa
這和大多數(shù)版本控制系統(tǒng)形成了鮮明對比,它們管理分支大多采取備份所有項目文件到特定目錄的方式,所以根據(jù)項目文件數(shù)量和大小不同,可能花費的時間也會有相當(dāng)大的差別,快則幾秒,慢則數(shù)分鐘。而 Git 的實現(xiàn)與項目復(fù)雜度無關(guān),它永遠(yuǎn)可以在幾毫秒的時間內(nèi)完成分支的創(chuàng)建和切換。