在前面兩盤文章中介紹了Git的基本原理,都是理論知識。這篇文章咱們再次回到實踐中,看看Git分支(branch)的使用。git
在代碼版本控制工具中,都會有branch的概念。剛開始創建版本倉庫的時候,咱們只有一個主分支(master branch),咱們不可能把平常的新功能開發、代碼優化以及bug修復等概念工做全都放在主分支上,這樣會使主分支很難維護。這就是爲何會有branch。app
在Git中,branch的建立很簡單,咱們能夠經過下面的命令建立一個"release-1.0"的branch。工具
而後經過"checkout"命令來切換branch。優化
在Git中,咱們能夠經過"git checkout -b"命令來達到同時建立並切換branch的效果。spa
注意:你們必定還記得第二篇文章中咱們經過"checkout"命令來還原WorkSpace中的更新,在還原的命令中咱們使用的是"checkout --",若是沒有"--"就表明切換branch。版本控制
根據前面兩篇文章的知識,咱們進入".git/refs/heads"目錄,發現有"HEAD"和"release-1.0"兩個文件,而且兩個文件包含的哈希值相同,根據"git log"能夠知道這個哈希值表明master上最新的提交。因此,建立分支後咱們會獲得下面的關係圖,從值張圖中能夠看到,branch的切換對應HEAD引用值的改變。code
有了新的branch以後,咱們就能夠分別在不一樣的branch上工做了。假設咱們如今更新"app.py",而且在release-1.0 branch上面提交,從新查看對象關係圖。對象
根據上面的對象圖,能夠分析出如下信息:blog
通過查看,"ref/heads/release-1.0"文件的內容確實是release-1.0 branch上最新的更新。而且,當咱們切換到master branch的時候,全部master上的東西都沒有變化。開發
分支的刪除比較簡單,可使用"git branch -d"命令,爲了避免影響後面的內容,這裏演示新建、刪除dev branch。
branch的建立是爲了方便開發、修復bug以及保持master的穩定。可是最終branch上的內容仍是要合併到master的,接下來就看看分支的合併。
在Git中,能夠經過"Git merge"來合併分支,繼續前面的例子,咱們能夠把"app.py"的更新merge到master branch上。
這時候,master的HEAD就被更新了,跟release-1.0內容一致了,這些就是merge命令作的事情。
在branch的合併中,不少時候咱們會遇到衝突,那麼咱們就須要手動解決衝突,而後再提交了。
爲了演示衝突合併,咱們回退master到上一次提交(必定還記得git reset吧),而後一樣更新"app.py"提交到master。
經過上面能夠看到,master和release-1.0上同時修改了"app.py",合併時引發了衝突。在Git中,會用"<<<<<<<","=======",">>>>>>>"標記出衝突區域,咱們須要根據這些符號找到全部的衝突並解決。
衝突解決以後,咱們經過"git log"來產看一些結果,可是此次咱們要給"git log"加一些參數。
同時,這裏給出最新的對象關係圖
在branch的使用過程當中,咱們還會常用到stash和diff操做,下面分別進行介紹。
在Git中,stash是個頗有用的命令,能夠保存咱們作到一半的工做,能夠理解成一個未完成工做的保存區。
假如咱們在release-1.0 branch作了一些更新,可是想作的事情尚未所有完成,不能提交,這是咱們又要切換到master branch,這是Git會禁止branch切換。
好比,例子中咱們從app.py中刪除"div(16, 4)"。
這個時候咱們就須要使用stash來保存未完成的工做了。
若是須要繼續前面的工做,咱們能夠經過"git stash apply"來還原被保存的工做狀態。
stash空間就像是一個棧空間,每次經過stash保存等內容都會被壓入stash棧。命令不只僅是支持簡單的list、apply操做,接下來咱們看看更多的stash命令。
相信你們都看到了stash的強大,下面咱們來看看stash的工做原理。在使用過stash保存以後,咱們會發現.git目錄中出現了兩個新文件".git/refs/stash"和".git/logs/refs/stash"。兩個文件內容分別以下:
.git/refs/stash
dcac98e565864edc6f636b08660baebe2c97e7d2
.git/logs/refs/stash
0000000000000000000000000000000000000000 dcac98e565864edc6f636b08660baebe2c97e7d2 WilberTian <Wilber***com> 1420201804 +0800 WIP on release-1.0: ed17809 update app.py on release branch
根據咱們在對象關係模型那篇文章中學到的內容,咱們能夠獲得如下信息,因此能夠看到,stash存放內容也是能夠根據對象關係模型一點點找出來。
這裏就不提供對象關係圖了,比較複雜,有興趣的同窗能夠本身畫一個看看各個對象之間的關係。
在前面的文章中咱們經過diff比較過同一個分支上的內容在WrokSpace、stage和repo中的差異。
一樣diff能夠支持分支之間的比較。
經過這篇文章介紹了分支的基本使用,同時介紹了一個很是有用的stash命令。
在使用Git進行代碼控制中,分支是很容易建立的,因此也建議使用分支來進行開發新功能、bug修復。