一、分支介紹
在版本控制過程當中,有時候需要同時推進多個任務,這樣的話,就可以給每個任務建立單獨的分支。
有了分支之後,對應的開發人員就可以把自己的工作從主線上分離出來,在做自己分支開發的時候,不會影響到主線分支的執行。
如圖所示:
- 要開發個新功能,加個藍色背景。那麼從master上建一個分支feature-blue,開發完後,合回到master。
- 同時另外一個新功能也要做,給系統加個小遊戲。同樣上建一個分支feature-game進行開發。
- 發現feature-blue上有個bug,那麼再從master上建一個熱修復分支hot-fix進行bug修改,完事後合到master。
所以,在眾多分支並行開發的時候,master上的程式碼是正常在伺服器上執行的,不會被影響。
故使用分支有如下優點:
- 同時並行推進多個功能開發,提高開發效率。
- 各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支造成影響。失敗的分支可以刪除掉重新開始即可。
二、分支操作
1. 檢視分支
git branch -v
可以檢視當前本地庫有多少分支,其中*
表示當前所在的分支。
2. 建立分支
git branch 分支名
建立完成後,再次檢視分支,就可以看到新建的分支hot-fix
。
3. 切換分支
當前所在還是master分支,我不想動master分支的內容,希望在hot-fix
分支上進行修改,那麼現在切換到目標分支。
git checkout 分支名
已經切換成功。
現在我可以在hot-fix分支下進行檔案內容的修改了,我改動hello.txt的第一行內容。
然後git add hello.txt
和git commit -m "hot-fix first commit" hello.txt
。
用cat hello.txt
可以檢視文字內容,在git裡 linux命令通用。
4. 合併分支
正常合併
在hot-fix
修改完內容提交之後,現在切換回master分支,並且檢視檔案內容,發現還是原來的樣子,沒有受到影響。
現在我要把hot-fix
上的內容合併到master
上:
git merge 分支名
注意,這裡是把命令列後輸入的分支 合併到 當前所在分支,所以我先要切回到master
上,才可以把hot-fix
合過來。
合併完成,檢視master分支上的檔案內容,發現hot-fix上新增的內容已經合併了過來。
衝突合併
合併分支時,兩個分支在同一個檔案的同一個位置有兩套完全不同的修改,這就產生了衝突,這也是團隊協助中最常見的場景之一了。
此時,git無法決定使用哪一個,所以必須人為的決定新程式碼的內容。
現在來造成一個衝突的場景:
- 在
master
分支,在hello.txt的最後一行末尾,增加新內容-"master test"。 - 切換到
hot-fix
分支,在hello.txt的最後一行末尾,增加新內容-"hot-fix test"。 - 切換到
master
分支,合併hot-fix
分支。
提示自動合併失敗,因為在hello.txt
裡面產生了衝突,此時檢視git status
,也可以看到提示。
OK,git處理不了,只能我們親自出馬了。此時可以開啟檔案vim hello.txt
,會發現在檔案裡有衝突的提示。
有3個提示:
<<<<<<< HEAD
,表示當前分支。=======
,相當於分界線,等號與上面的HEAD之間,是當前分支的程式碼。等號與下面的 hot-fix,是要合併過來的程式碼。>>>>>>> hot-fix
,要合併過來的分支。
現在我手動處理,希望2個分支的程式碼都保留,那麼我留下這2行程式碼,把其餘的提示資訊去掉即可。
完成後進行git add hello.txt
。
注意,在接下來的git commit操作中,就不要帶檔名了,否則會報錯,如下:
git此時還是不知道用哪個分支的hello.txt,所以提交的時候不要帶檔名了。
可以看到合併成功,接著檢視下檔案內容,cat hello.txt
,結果如願以償。
注意,這裡合併時候的修改,也只是改了master
分支的檔案內容,hot-fix
分支是不受影響的,可以切到hot-fix
檢視檔案內容便知。
分支原理
跟版本切換一樣,分支切換的底層同樣是指標。
上面的2個分支master
和hot-fix
,其實都是指向具體版本記錄的指標。而當前所在的分支,其實是有HEAD決定的,HEAD指向哪個分支,現在就在那個分支上。
所以,建立分支的本質就是多建立一個指標,故切換分支的本質就是移動HEAD指標。
接下來是git的團隊協助相關內容。