前言
今天這篇文章我們繼續git教學的第五篇,主要講解的是git的分支管理,這也號稱是git的‘必殺技特性’。
分支是什麼?
git通過保存一系列不同時刻的文件快照來實現數據存儲。
每次在進行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 branch命令也可以查看當前處於哪個分支上。如果當前在哪個分支上,則在分支名之前有一個‘*’標識。
分支的合併
在一個上線的項目中,一般至少會有多個用於運行的分支,比如生產環境一般是master分支,開發環境下的dev分支,測試環境下的test分支,還有一系列的個人開發分支self。
分支的合併有merge指令即可完成,merge完成後兩個分支記錄將處於同一個狀態。
比如我們在發現一個線上問題時,需要由master分支新拉一個hotfix分支進行問題的修復,此時的分支情況可能如下如所示。
在hotfix分支上修復完問題後,可以切換至master分支,然後將hotfix分支合併至master分支。
在分支合併完後,分支情況如下圖所示。
刪除本地分支
當我們不再需要一個本地分支時,可以通過-d參數來刪除它。
有一點需要注意的是,需要先checkout到別的分支才能刪除需要刪除的分支。
如上一個例子,當hotfix修復完畢後可以將hotfix分支刪除。
有衝突時的分支合併
當多人協同開發時,出現文件衝突是一件很常見的事情。
衝突的原因是同一個文件的同一個部分,在不同的分支中都有修改,這樣git就無法自動合併,而是將有衝突的信息暴露出來交由開發人員自己修改後再進行合併。
當我們通過merge命令合併有衝突的分支時,會出現CONFLICT字眼,如下圖中的提示信息。
當出現衝突時,是無法merge成功的,後續的操作也將被阻塞住,因此解決衝突是一步必要的操作。
衝突文件內容
如果文件衝突後,我們打開衝突的文件,衝突部分的內容會有很明顯的<<<<<< ======= >>>>>>> 等標識。
如下圖所示就是一個衝突的文件內容。
上圖中表示的是在HEAD分支和iss53分支的index.html文件衝突,接下來就需要開發人員進行決定,是選用HEAD分支中的內容還是選用iss53分支中的內容,而刪掉另一個分支的內容。
繼續合併
當開發人員將衝突解決後,需要再進行一次git add操作將修改的文件再次添加至暫存區,並且進行一次commit操作。
解決衝突時可以直接通過git commit而不用添加-m選項填寫額外的提交信息,默認的提交操作後會出現以下信息。
當然如果手動填寫了-m提交信息,也是可以的,就如同正常的提交操作。
結束語
今天這篇文章主要講解了git branch相關的內容,通過實際的演示提示大家的理解,大家要好好消化。
閱讀更多 coder分享 的文章