【Git】3. Git重要特性-分支操作,合併衝突詳解

把蘋果v咬哭發表於2021-05-08

一、分支介紹

在版本控制過程當中,有時候需要同時推進多個任務,這樣的話,就可以給每個任務建立單獨的分支。
有了分支之後,對應的開發人員就可以把自己的工作從主線上分離出來,在做自己分支開發的時候,不會影響到主線分支的執行。

如圖所示:

  1. 要開發個新功能,加個藍色背景。那麼從master上建一個分支feature-blue,開發完後,合回到master。
  2. 同時另外一個新功能也要做,給系統加個小遊戲。同樣上建一個分支feature-game進行開發。
  3. 發現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.txtgit 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無法決定使用哪一個,所以必須人為的決定新程式碼的內容。

現在來造成一個衝突的場景:

  1. master分支,在hello.txt的最後一行末尾,增加新內容-"master test"。
  2. 切換到hot-fix分支,在hello.txt的最後一行末尾,增加新內容-"hot-fix test"。
  3. 切換到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個分支masterhot-fix,其實都是指向具體版本記錄的指標。而當前所在的分支,其實是有HEAD決定的,HEAD指向哪個分支,現在就在那個分支上。
所以,建立分支的本質就是多建立一個指標,故切換分支的本質就是移動HEAD指標。

接下來是git的團隊協助相關內容。

相關文章