03.06 Git教學篇5-git必殺技特性,分支管理

前言

今天這篇文章我們繼續git教學的第五篇,主要講解的是git的分支管理,這也號稱是git的‘必殺技特性’。

Git教學篇5-git必殺技特性,分支管理

git

分支是什麼?

git通過保存一系列不同時刻的文件快照來實現數據存儲。

每次在進行git提交時,都會生成一個提交對象,這個提交對象都會產生一個指向暫存區內容快照的指針。而且每個提交對象中都會包含一個指向上一次提交(父提交對象)的指針。

通過這一系列指針的指向,就構成了一個分支上的所有提交記錄。如下圖中,一個分支上的三次提交記錄,生成三個版本快照,然後通過指針相連。

Git教學篇5-git必殺技特性,分支管理

提交記錄

因此對於分支,我們可以理解為指向提交對象的可變指針

分支創建與切換

對於每個git倉庫都有一個默認的master分支,實際上master分支和其他自定義分支沒有任何區別。

我們可以通過git branch命令去創建一個新的分支,但是並不會直接切換至新建的分支。如果需要切換到新的分支,是通過git checkout命令。

如果我們需要將這兩步操作合併為異步,則可以通過git checkout加-b參數實現。

這也意味著以下的命令是等價的。

$ git branch dev

$ git checkout dev

$ git checkout -b dev

因為分支的創建都是基於指針的,那麼在擁有多個指向相同歷史的指針時,git怎麼知道當前是在哪個分支呢?

在git中有一個特殊的HEAD指針,指向的是當前所在本地分支的最新快照,當我們切換到新的分支中時,HEAD分支也會隨著移動。

如下圖中,有master和testing兩個分支,HEAD指針指向的是master,表示的是當前處於master分支上。

Git教學篇5-git必殺技特性,分支管理

HEAD指針

通過git branch命令也可以查看當前處於哪個分支上。如果當前在哪個分支上,則在分支名之前有一個‘*’標識。

Git教學篇5-git必殺技特性,分支管理

git branch

分支的合併

在一個上線的項目中,一般至少會有多個用於運行的分支,比如生產環境一般是master分支,開發環境下的dev分支,測試環境下的test分支,還有一系列的個人開發分支self。

分支的合併有merge指令即可完成,merge完成後兩個分支記錄將處於同一個狀態。

比如我們在發現一個線上問題時,需要由master分支新拉一個hotfix分支進行問題的修復,此時的分支情況可能如下如所示。

Git教學篇5-git必殺技特性,分支管理

分支記錄

在hotfix分支上修復完問題後,可以切換至master分支,然後將hotfix分支合併至master分支。

Git教學篇5-git必殺技特性,分支管理

合併分支

在分支合併完後,分支情況如下圖所示。

Git教學篇5-git必殺技特性,分支管理

合併後的分支

刪除本地分支

當我們不再需要一個本地分支時,可以通過-d參數來刪除它。

有一點需要注意的是,需要先checkout到別的分支才能刪除需要刪除的分支。

如上一個例子,當hotfix修復完畢後可以將hotfix分支刪除。

Git教學篇5-git必殺技特性,分支管理

刪除分支

有衝突時的分支合併

當多人協同開發時,出現文件衝突是一件很常見的事情。

衝突的原因是同一個文件的同一個部分,在不同的分支中都有修改,這樣git就無法自動合併,而是將有衝突的信息暴露出來交由開發人員自己修改後再進行合併。

當我們通過merge命令合併有衝突的分支時,會出現CONFLICT字眼,如下圖中的提示信息。

Git教學篇5-git必殺技特性,分支管理

衝突提示

當出現衝突時,是無法merge成功的,後續的操作也將被阻塞住,因此解決衝突是一步必要的操作。

  • 衝突文件內容

如果文件衝突後,我們打開衝突的文件,衝突部分的內容會有很明顯的<<<<<< ======= >>>>>>> 等標識。

如下圖所示就是一個衝突的文件內容。

Git教學篇5-git必殺技特性,分支管理

衝突文件內容

上圖中表示的是在HEAD分支和iss53分支的index.html文件衝突,接下來就需要開發人員進行決定,是選用HEAD分支中的內容還是選用iss53分支中的內容,而刪掉另一個分支的內容。

  • 繼續合併

當開發人員將衝突解決後,需要再進行一次git add操作將修改的文件再次添加至暫存區,並且進行一次commit操作。

解決衝突時可以直接通過git commit而不用添加-m選項填寫額外的提交信息,默認的提交操作後會出現以下信息。

Git教學篇5-git必殺技特性,分支管理

解決衝突後默認commit信息

當然如果手動填寫了-m提交信息,也是可以的,就如同正常的提交操作。

結束語

今天這篇文章主要講解了git branch相關的內容,通過實際的演示提示大家的理解,大家要好好消化。


分享到:


相關文章: