1. 程式人生 > >git分支管理的策略和衝突問題

git分支管理的策略和衝突問題

[toc] ## 備註: 本文參考於廖雪峰老師的部落格[Git教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)。依照其部落格進行學習和記錄,感謝其無私分享,也歡迎各位檢視原文。 ## 知識點 - `git log --graph --pretty=oneline --abbrev-commit`檢視分支合併情況 - `git log --graph`檢視分支合併圖 - 當兩個分支修改同一個檔案時,可能發生兩個分支不能自動合併的問題,需要手動解決衝突(合併時,Git將衝突標識了出來),然後再次提交,即可完成合並。 - 使用引數`--no-ff`禁用快合併模式,`git merge --no-ff -m"merge with no-ff" dev`,合併 ## 關於分支中的衝突 如下,新建一個分支dev2,並且在新分支上開發: ```s $ git checkout -b dev2 切換到一個新分支 'dev2' ``` 修改readme.txt,新增一行。 ```s Creating a new branch is quick AND simple. ``` - 在dev2分支進行提交, ```s $ git add readme.txt $ git commit -m"add new line at readme on dev2" [dev2 4a097db] add new line at readme on dev2 1 file changed, 1 insertion(+) ``` - 切換到master分支,同時在master上修改readme檔案(新增域dev2分支上檔案不同的內容,`Creating a new branch is quick & simple.`),並且提交 ```s git checkout master 切換到分支 'master' 您的分支領先 'origin/master' 共 1 個提交。 (使用 "git push" 來發布您的本地提交) ``` ```s $ git add readme.txt $ git commit -m"add new line at readme on master" [master d562bf7] add new line at readme on master 1 file changed, 1 insertion(+) ``` 如上,Git會自動提示當前master分支比遠端`origin/master`分支領先一個提交 現在master分支和dev2 分支都有了各自新的提交,在這種情況下,Git無法執行“快速合併”,只能試圖把各自的修改合併起來,由於同時都修改了同一行內容,此時會有衝突。 ```s $ git merge dev2 自動合併 readme.txt 衝突(內容):合併衝突於 readme.txt 自動合併失敗,修正衝突然後提交修正的結果。 ``` Git提示自動合併存在衝突,衝突檔案是readme,需要修正衝突然後提交修正後的結果 如果用`git status`檢視看當前狀態 ```s $ git status 位於分支 master 您的分支領先 'origin/master' 共 2 個提交。 (使用 "git push" 來發布您的本地提交) 您有尚未合併的路徑。 (解決衝突並執行 "git commit") 未合併的路徑: (使用 "git add <檔案>..." 標記解決方案) 雙方修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") ``` 如上,提示雙方修改 - 檢視`readme.txt`的內容 ```s $ cat readme.txt `this is a test that I learn and use git version control system this is a beginning wofaidognyixie dognxi create two new branch <<<<<<< HEAD Creating a new branch is quick & simple. ======= Creating a new branch is quick AND simple. >>>>>>> dev2 ``` - Git用`<<<<<<<`、`=======`、`>>>>>>>`標記出不同分支的內容,我們修改如下後儲存 ```s Creating a new branch is quick and simple. ``` - 修改衝突後提交 ```s $ git add readme.txt $ git commit -m"conflict fixed" [master 8f69de8] conflict fixed ``` Git提示衝突已經修復,現在`master`和`dev2`分支均指向了現在工作區的狀態。 - 使用`git log --graph --pretty=oneline --abbrev-commit`可以檢視分支的合併情況 ```s $ git log --graph --pretty=oneline --abbrev-commit * 8f69de8 conflict fixed |\ | * 4a097db add new line at readme on dev2 * | d562bf7 add new line at readme on master |/ * 03d07d2 modify readme.txt at branch * 036ced2 a push test * 6a0f133 remove test.txt * b5c87d4 add a test file * d5b84bf modifya readme file * 3033dda add a readme file ``` 如上,分支合併和衝突記錄 - 此時可以刪除dev2分支 ```s $ git branch -d dev2 已刪除分支 dev2(曾為 4a097db)。 ``` 衝突解決完成 ## 分支管理的策略 通常,合併分支時Git使用`Fast forward`模式快速合併。但是快速模式刪除分支,會丟失分支資訊。 強制禁用`Fast forward`模式,Git會將merge記錄為一個新的提交,同時分支歷史會記錄分支資訊。 - 切換到`dev`分支,並修改`readme`檔案,同時提交`commit` ```s $ git checkout -b dev 切換到一個新分支 'dev' $ git add readme.txt $ git commit -m"a new branch" [dev 44dffc0] a new branch 1 file changed, 1 insertion(+) ``` - 切換到`master`分支 ```s $ git checkout master 切換到分支 'master' 您的分支領先 'origin/master' 共 4 個提交。 (使用 "git push" 來發布您的本地提交) ``` - 使用`--no-ff`引數合併分支`dev`到當前`master`,本次合併要建立一個新的`commit`,所以加上`-m`引數描述 ```s $ git merge --no-ff -m"merge with no-ff" dev Merge made by the 'recursive' strategy. readme.txt | 1 + 1 file changed, 1 insertion(+) ``` - 使用`git log`檢視分支合併圖 ```s $ git log --graph --pretty=oneline --abbrev-commit * 7c4d427 merge with no-ff |\ | * 44dffc0 a new branch |/ * 8f69de8 conflict fixed |\ | * 4a097db add new line at readme on dev2 * | d562bf7 add new line at readme on master |/ * 03d07d2 modify readme.txt at branch * 036ced2 a push test * 6a0f133 remove test.txt * b5c87d4 add a test file * d5b84bf modifya readme file * 3033dda add a readme file ``` ## 分支策略 > 實際開發中,分支管理應按照以下幾點: > > 1. `master`分支是穩定分支,用來發布最新穩定版本,開發中不需要修改它 > > 2. 開發中儘量在`dev`中開發,擴充套件新功能、修復bug等,等到正式版釋出時,在將`dev`分支合併到`master`上。 > > 3. 開發人員在`dev`分支上開發,每個人都有自己的分支,並且往`dev`分支上合併。 ![團隊合作分支開發](https://img2020.cnblogs.com/blog/1108935/202007/1108935-20200715204522408-6428634