Git Step by Step – (5) Git分支(branch)

在前面兩盤文章中介紹了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上最新的更新
  • release-1.0 branch上面的更新不會體如今master branch

通過查看,"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相關操做

在branch的使用過程當中,咱們還會常用到stash和diff操做,下面分別進行介紹。

stash

在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命令。

  1. git stash save:能夠經過自定義的信息來描述一個stash

  2. git stash apply stash@{n}:經過這個命令,咱們能夠選擇stash棧中的stash,從而恢復到特定的狀態;"git stash apply"使用棧頂來還原WorkSpace。
  3. git stash pop:就像"git stash apply"使用棧頂來還原WorkSpace,可是同時會從stash棧中刪除當前的棧頂stash。

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存放內容也是能夠根據對象關係模型一點點找出來。

這裏就不提供對象關係圖了,比較複雜,有興趣的同窗能夠本身畫一個看看各個對象之間的關係。

 

branch之間的diff

在前面的文章中咱們經過diff比較過同一個分支上的內容在WrokSpace、stage和repo中的差異。

一樣diff能夠支持分支之間的比較。

  • git diff branchName:把當前branch跟branchName進行比較,也可使用"git diff branchNameA branchNameB"
  • git diff branchName -- fileName:比較兩個branch的fileName文件差別

 

總結

經過這篇文章介紹了分支的基本使用,同時介紹了一個很是有用的stash命令。

在使用Git進行代碼控制中,分支是很容易建立的,因此也建議使用分支來進行開發新功能、bug修復。

相關文章
相關標籤/搜索