理解git結構與簡單操做(三)認識版本庫與分支

版本庫,也就是git的分支庫,實際上是git最核心的部分。當咱們提到git時,其實就是在說git分支。若是你是一個我的開發者,你的項目只有一我的在開發,永遠只有一個master分支,那麼你可能永遠接觸不到分支的內容,你對git的瞭解會永遠停留在「瞭解」這一階段。git

版本庫的基本組成

版本庫這個名稱來源,就是它管理的是一個個「版本」。segmentfault

版本庫是由分支組成的,分支則是由commit組成的。commit就是版本庫的基本單位svn

在git中,每一個都commit有一個獨一無二的「commit id」,也就是說經過這個id你能夠精肯定位到某一個commit上。spa

因此,爲何git要求每次commit的時候必須爲commit添加明確的commit message,而且要專門開闢出stage暫存區來管理每一次commit的內容(svn就沒有暫存區),就是爲了可以隨時進行commit(代碼版本)層面的操做,明確每一次commit,保證出現問題時能快速定位,以及完成版本回退等操做。3d

關於分支

簡單的說,分支就是由commit串成的一條時間線,就是這樣子的:指針

上面的每一個圈圈都是一次commit。code

在新建git倉庫時,git會自動給你建立一條分支,叫master,你以後所作的全部操做都是在這個master分支上操做。不過,並不要把一個分支就理解爲是這樣的一條時間線。這裏可能有點繞,也是git中最抽象的一個點之一。就是:對象

master分支實際上是一個指針,它指向一個commit,表明了在這條時間線上,master指針指向的那個commit時間點的代碼狀態。可能對於指針概念有基礎的同窗會更好理解一點。以下圖:blog

當咱們創建一個分支時,使用兩種方式:開發

  • git branch <branch name> (僅建立分支)
  • git checkout -b <branch name> (建立分支並切換到該分支)

這樣子創建的分支指針會指向目前你所在的那個分支(master),假如咱們建立了一個分支叫dev,那麼咱們的時間線就變成了這個樣子:

能夠看到,時間線仍是那條時間線,不過已經有兩條分支同時存在了,只是這兩條分支都指向同一個commit,因此兩條分支內容徹底相同,git也就只會指一下指針,不會對代碼和時間線作任何操做。可是,抽象來看,你能夠把這兩條分支看做是兩條線。

而咱們怎麼肯定哪一條分支是咱們當前的分支呢?也是指針,不過是一個指向指針的指針,叫作HEAD。HEAD指針在git中算是個關鍵字,HEAD就是當前指向當前分支的指針的意思。咱們只用git branch dev建立分支時,HEAD指針不會作改變,當前分支依然是master分支,當前狀態如圖所示:

當咱們在當前這種狀態下,將暫存區中的內容進行一次提交時,會將時間線向前推動,生成一個commit,而後把當前分支master指向最新的commit。如圖所示:

當切換分支時,咱們會使用git checkout <branch name>,將HEAD指針指向切換過去的那個分支名。

咱們是否是見到了老朋友checkout!

在前面的暫存區我講過,checkout做爲檢出操做是將暫存區中的內容同步到工做區的方法。這裏的checkout依然是檢出的意思,只不過檢出的對象變成了相應分支的文件

其實咱們能夠把暫存區想象成一個分支,暫存區的內容就是commit的內容,這兩種操做的意義就保持一致了,只不過檢出分支時HEAD指針會移動。checkout文件會修改工做區。因此,執行git checkout dev後,分支狀態就變成了這樣:

而上面說過,checkout會修改工做區,因此你磁盤上的文件就變成了dev分支上那次commit時的樣子。而在建立時提到的git commit -b <branch name>則同時完成了「建立分支」和「檢出分支」兩個操做,方便得很。

使用git branch -av就能夠查看全部分支的信息了(a是all,v是verbose)。

涉及操做:git branch <branch name>, git checkout <branch name>

文章連接

理解git結構與簡單操做(一)git的本質

理解git結構與簡單操做(二)工做區與暫存區

理解git結構與簡單操做(三)認識版本庫與分支

理解git結構與簡單操做(四)合併分支的方法與策略

相關文章
相關標籤/搜索