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


一、分支介紹

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

如圖所示:

  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的團隊協助相關內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM