7.Git分支-分支簡介、分支創建、分支切換


1.分支簡介

  幾乎所有的版本控制系統都支持某種形式的分支。使用分支意味着可以把你的工作從開發主線上分離開來,以免影響開發主線。Git的分支是其必殺技,它相對於其它版本控制系統來說,具有難以置信的輕量性,創建分支以及切換分支幾乎都是瞬間完成。Git鼓勵頻繁的使用與合並分支。

  Git保存的不是文件的變化或者差異,而是一系列不同時刻的文件快照。

  在進行commit操作的時候,Git會保存一個提交對象(commit object),該對象包含一個指向暫存內容快照的指針,包含指向父commit對象的指針,以及提交者的名字,提交信息等。首次提交的對象沒有父對象,普通提交操作產生的提交對象只有一個父對象,合並操作產生的提交對象有多個父對象。

  暫存操作(git add)會計算每一個文件的校驗和(也就是一個hash值,Git使用的hash算法是SHA-1),然后將當前版本的文件快照保存在Git倉庫中(Git使用blob對象來保存它們),最終將校驗和加入到暫存區域等待提交。

  當執行git commit操作的時候,Git會計算每一個目錄的校驗和,然后在Git倉庫中將這些校驗和保存為樹對象。git commit創建的提交對象包含指向樹對象(項目根目錄對應的樹對象)的指針。

  如上圖所示,一個項目有一個根目錄,其對應的tree對象的校驗和是y46r5,根目錄下面有三個子目錄,對應的樹對象的校驗和分別為t5re4、h65er、hn63u,每個目錄下面有一些文件,Git將其保存為blob對象,每個文件對應於一個blob對象,同時也知道每個文件的校驗和。這樣一來,Git就能夠保存項目的樹狀結構,每一個時刻都有其不同的樹狀結構,就能夠在需要的時候恢復到某一個對應的狀態。

  如下圖,Git的提交對象包含指向內容快照的指針(hash值)以及指向父提交節點的指針(hash值), 每個快照對應於上圖中所有的tree對象和blob對象組成的部分。

  對於commit對象、tree對象、blob對象包含的詳細內容,可以參考下圖。  每個commit對象包含所指向的tree對象的hash值,每個tree對象包含所指向的blob對象的hash值。

 

   Git分支的本質實際上只是一個指向提交(commit)對象的可變指針。Git默認分支的名字是master,幾乎所有的倉庫都有一個master分支,這是由於git init自動創建它,並且大多數人都懶得去修改它。

2.分支創建

  分支的創建本質上只是創建了一個指向提交(commit)對象的指針。

  使用 git branch <branch name> 創建一個分支。這條命令將創建一個指向當前提交對象的分支。

注意:這條命令不會自動切換到新的分支上去。

  那么,Git又是如何知道當前在哪個分支上的呢?Git有一個名為HEAD的指針,它指向當前所在的本地分支(可以將其看作是當前分支的別名)。

  如下圖,創建一個testing分支,此時master和testing同時指向校驗和以f30ab開頭的提交對象,但是HEAD還是指向master,並沒有指向testing(因為git branch不會自動切換分支)。

  

  可以使用 git log --decorate 命令查看各個分支當前所指的對象。

3.分支切換

  使用 git checkout <branch-name> 切換分支,其本質上是將HEAD指針指向branch-name指向的分支。例如 git checkout testing 會產生如下圖所示結果:HEAD指向了testing分支。

  這時候,在提交(commit)一次,會得到如下圖所示的結果:master分支沒有向前移動,HEAD所指向的testing分支向前移動了。也就是說當我們執行git commit操作的時候,HEAD指向的分支隨着提交操作自動向前移動。

  如果執行git checkout master,這時候Git會做兩件事情:1.將HEAD指針指向master;2.將工作區的內容恢復成master所指向的快照內容(也就是master所指向的commit對象所指向的文件快照)。

  注意:分支切換會改變你本地的工作區域的內容。會將本地工作區域的內容恢復到被切換到的分支上最后一個提交時候的樣子。

  分支的本質實際上僅是包含所指提交對象的校驗和的文件(文件中存儲的是所指提交對象的校驗和,長度為40的hash字符串)。創建一個分支相當於給文件中寫入一個hash字符串,所以創建Git分支相當的高效。

  其它的版本控制系統,在創建分支的時候,會將所有的項目文件都復制一遍,並保存到特定的目錄。這會導致其它的版本控制系統的效率非常低效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM