使用分支可以把工作從開發主線上分離開來,以免影響開發主線
在很多版本控制系統中,依靠完全建立副本,但這是乙個略微低效的過程
而 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...