Git筆記(11) 分支簡介

2021-10-02 18:14:20 字數 4486 閱讀 1808

使用分支可以把工作從開發主線上分離開來,以免影響開發主線

在很多版本控制系統中,依靠完全建立副本,但這是乙個略微低效的過程

而 git 處理分支的方式超級輕量

建立新分支可瞬間完成,並且在不同分支之間的切換操作也便捷

與許多其它版本控制系統不同

git鼓勵在工作流程中頻繁地使用分支與合併

介紹分支需要從 git 是如何儲存資料的開始說起

在 git學習筆記(1) 版本控制 中提到 git 儲存的不是檔案的變化或者差異

而是一系列不同時刻的檔案快照

在進行提交操作時,git 會儲存乙個提交物件(commit object

可以很自然的想到——該提交物件會包含乙個指向暫存內容快照的指標

該提交物件還包含了作者的姓名和郵箱、提交時輸入的資訊以及指向它的父物件的指標

首次提交產生的提交物件沒有父物件,普通提交操作產生的提交物件有乙個父物件

而由多個分支合併產生的提交物件有多個父物件

為了更加形象地說明

假設現在有乙個工作目錄,裡面包含了3個將要被暫存和提交的檔案

暫存操作會為每乙個檔案計算校驗和

然後會把當前版本的檔案快照儲存到 git 倉庫中(git 使用blob物件來儲存它們)

最終將校驗和加入到暫存區域等待提交:

$ git add readme test.rb license

$ git commit -m 'the initial commit of my project'

當使用git commit進行提交操作時

git 會先計算每乙個子目錄(本例中只有專案根目錄)的校驗和

然後在 git 倉庫中這些校驗和儲存為樹物件

隨後,git 便會建立乙個提交物件

它除了包含上面提到的那些資訊外,還包含指向這個樹物件(專案根目錄)的指標

如此一來,git 就可以在需要的時候重現此次儲存的快照

現在,git 倉庫中有五個物件:

做些修改後再次提交

那麼這次產生的提交物件會包含乙個指向上次提交物件(父物件)的指標

git 的分支,其實本質上僅僅是指向提交物件的可變指標

即僅是包含所指物件校驗和的檔案

建立乙個新分支就相當於往乙個檔案中寫入 41 個位元組(40 個字元和 1 個換行符)

所以它的建立和銷毀都異常高效

git 的預設分支名字是master

在多次提交操作之後,其實已經有乙個指向最後那個提交物件的master分支

它會在每次的提交操作中自動向前移動

master 分支不是乙個特殊分支,只是因為預設建立,跟其它分支完全沒有區別

建立分支很簡單,它只是建立了乙個可以移動的新的指標

比如,建立乙個testing分支, 你需要使用git branch命令:

$ git branch testing
這會在當前所在的提交物件上建立乙個指標

有乙個名為head的特殊指標,指向當前所在的本地分支

head想象為當前分支的別名

在上面的例中,建立 乙個新分支,並不會自動切換到新分支中去

可以簡單地使用git log命令檢視:各個分支當前所指的物件

提供這一功能的引數是--decorate

$ git log --oneline --decorate

f30ab (head, master, testing) add feature #32 - ability to add new

34ac2 fixed bug #1328 - stack overflow under certain conditions

98ca9 initial commit of my project

當前 「master」 和 「testing」 分支均指向校驗和以 f30ab 開頭的提交物件

在 git學習筆記(9) 打標籤 中提及到使用git checkout命令檢視某個標籤所指向的檔案版本

同時也提及到這個命令使倉庫處於「分離頭指標(detacthed head)」狀態

很明顯,就是改變了head特殊指標

那麼利用git checkout切換到乙個已存在的分支

例如,現在切換到新建立的testing分支去:

$ git checkout testing
這樣head就指向testing分支了

現在不妨進行修改檔案,然後再提交一次:

testing分支向前移動了

但是master分支卻沒有,它仍然指向執行git checkout時所指的物件

現在切換回master分支:

這條命令做了兩件事:

使head指回master分支

將工作目錄恢復成master分支所指向的快照內容

現在做修改的話,專案將始於乙個較舊的版本

本質上來講,這就是忽略testing分支所做的修改,以便於向另乙個方向進行開發

不妨再稍微做些修改並提交:

$ vim test.rb

$ git commit -a -m 'made other changes'

現在,這個專案的提交歷史已經產生了分叉

上述兩次改動針對的是不同分支:

可以在不同分支間不斷地來回切換和工作,並在時機成熟時將它們合併起來

執行git log --oneline --decorate --graph --all命令檢視分叉歷史

它會輸出你的提交歷史、各個分支的指向以及專案的分支分叉情況

$ git log --oneline --decorate --graph --all

* c2b9e (head, master) made other changes

| * 87ab2 (testing) made a change

|/* f30ab add feature #32 - ability to add new formats to the

* 34ac2 fixed bug #1328 - stack overflow under certain conditions

* 98ca9 initial commit of my project

參考: git

以上內容,均根據git官網介紹刪減、新增和修改組成

Git筆記 2 分支管理

svn有分支管理,但是建立和切換分支耗時特別長,形同虛設。建立於合併分支 檢視分支 git branch 建立分支 git branch 切換分支 git checkout 建立 切換分支 git checkout b 合併某分支到當前分支 git merge 刪除分支 git branch d 強...

Git學習筆記4 分支

參考鏈結廖雪峰git教程 建立本地分支 git branch testing 建立乙個分支,並命名為testing 建立遠端分支 分兩步 git branch testing 建立乙個分支,並命名為testing git push origin testing 將分支推送到遠端 相當於建立乙個遠端分...

Git學習筆記 7 分支操作

在多人合作專案中,常常出現多個人共同對乙個專案進行修改的情況,因此不會直接在主幹master上進行操作,而是重新開闢新的分支,在新的分支上進行開發,除錯,當除錯通過後才會將分支專案的 合併到主幹中。命令描述 git checkout branch 切換到指定分支 git checkout b new...