git分支管理的策略和衝突問題
目錄
備註:
本文參考於廖雪峰老師的部落格Git教程。依照其部落格進行學習和記錄,感謝其無私分享,也歡迎各位檢視原文。
知識點
-
git log --graph --pretty=oneline --abbrev-commit
檢視分支合併情況 -
git log --graph
檢視分支合併圖 -
當兩個分支修改同一個檔案時,可能發生兩個分支不能自動合併的問題,需要手動解決衝突(合併時,Git將衝突標識了出來),然後再次提交,即可完成合並。
-
使用引數
--no-ff
禁用快合併模式,git merge --no-ff -m"merge with no-ff" dev
關於分支中的衝突
如下,新建一個分支dev2,並且在新分支上開發:
$ git checkout -b dev2
切換到一個新分支 'dev2'
修改readme.txt,新增一行。
Creating a new branch is quick AND simple.
- 在dev2分支進行提交,
$ 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.
),並且提交
git checkout master
切換到分支 'master'
您的分支領先 'origin/master' 共 1 個提交。
(使用 "git push" 來發布您的本地提交)
$ 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無法執行“快速合併”,只能試圖把各自的修改合併起來,由於同時都修改了同一行內容,此時會有衝突。
$ git merge dev2
自動合併 readme.txt
衝突(內容):合併衝突於 readme.txt
自動合併失敗,修正衝突然後提交修正的結果。
Git提示自動合併存在衝突,衝突檔案是readme,需要修正衝突然後提交修正後的結果
如果用git status
檢視看當前狀態
$ git status
位於分支 master
您的分支領先 'origin/master' 共 2 個提交。
(使用 "git push" 來發布您的本地提交)
您有尚未合併的路徑。
(解決衝突並執行 "git commit")
未合併的路徑:
(使用 "git add <檔案>..." 標記解決方案)
雙方修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
如上,提示雙方修改
- 檢視
readme.txt
的內容
$ 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用
<<<<<<<
、=======
、>>>>>>>
標記出不同分支的內容,我們修改如下後儲存
Creating a new branch is quick and simple.
- 修改衝突後提交
$ git add readme.txt
$ git commit -m"conflict fixed"
[master 8f69de8] conflict fixed
Git提示衝突已經修復,現在master
和dev2
分支均指向了現在工作區的狀態。
- 使用
git log --graph --pretty=oneline --abbrev-commit
可以檢視分支的合併情況
$ 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分支
$ git branch -d dev2
已刪除分支 dev2(曾為 4a097db)。
衝突解決完成
分支管理的策略
通常,合併分支時Git使用Fast forward
模式快速合併。但是快速模式刪除分支,會丟失分支資訊。
強制禁用Fast forward
模式,Git會將merge記錄為一個新的提交,同時分支歷史會記錄分支資訊。
- 切換到
dev
分支,並修改readme
檔案,同時提交commit
$ 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
分支
$ git checkout master
切換到分支 'master'
您的分支領先 'origin/master' 共 4 個提交。
(使用 "git push" 來發布您的本地提交)
- 使用
--no-ff
引數合併分支dev
到當前master
,本次合併要建立一個新的commit
,所以加上-m
引數描述
$ 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
檢視分支合併圖
$ 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
分支策略
實際開發中,分支管理應按照以下幾點:
master
分支是穩定分支,用來發布最新穩定版本,開發中不需要修改它開發中儘量在
dev
中開發,擴充套件新功能、修復bug等,等到正式版釋出時,在將dev
分支合併到master
上。開發人員在
dev
分支上開發,每個人都有自己的分支,並且往dev
分支上合併。