參考博文:廖雪峰Git教程
1. 分支說明
分支在實際中有什么用呢?假設你准備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由於代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。
現在有了分支,就不用怕了。你創建了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合並到原來的分支上,這樣,既安全,又不影響別人工作。
2. 創建與合並分支
2.1. 創建且使用分支
1 [root@mini05 zhangtest]# pwd 2 /opt/git_repository/zhangtest 3 [root@mini05 zhangtest]# git checkout -b dev 4 Switched to a new branch 'dev'
git checkout
命令加上-b
參數表示創建並切換,相當於以下兩條命令:
1 $ git branch dev # 創建分支 2 $ git checkout dev # 使用分支 3 Switched to branch 'dev'
查看當前分支
1 [root@mini05 zhangtest]# git branch # 當前分支前面會標一個*號 2 * dev 3 master
在當前分支提交信息
1 [root@mini05 zhangtest]# cat test.info 2 111 3 222 4 333 5 where are you from? # 增加的內容 6 [root@mini05 zhangtest]# git add test.info 7 [root@mini05 zhangtest]# git commit -m "add test.info" 8 [dev 068d030] add test.info 9 1 file changed, 1 insertion(+)
OK,現在 dev
分支的工作完成,我們就可以切換回master
分支
2.2. 切回到master並合並分支
切回master分支
1 [root@mini05 zhangtest]# git checkout master 2 Switched to branch 'master' 3 [root@mini05 zhangtest]# git branch 4 dev 5 * master 6 [root@mini05 zhangtest]# cat test.info 7 111 8 222 9 333
切換回master
分支后,再查看一個test.info文件,剛才添加的內容不見了!因為那個提交是在dev
分支上,而master
分支此刻的提交點並沒有變
合並dev分支
把dev
分支的工作成果合並到master
分支上
1 [root@mini05 zhangtest]# git merge dev 2 Updating c752e64..068d030 3 Fast-forward 4 test.info | 1 + 5 1 file changed, 1 insertion(+) 6 [root@mini05 zhangtest]# cat test.info 7 111 8 222 9 333 10 where are you from?
合並后,再查看test.info的內容,就可以看到,和dev
分支的最新提交是完全一樣的。
2.3. 刪除dev分支
1 [root@mini05 zhangtest]# git branch -d dev # 刪除分支 2 Deleted branch dev (was 068d030). 3 [root@mini05 zhangtest]# git branch 4 * master
2.4. 分支說明【重點】
因為創建、合並和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合並后再刪掉分支,這和直接在master
分支上工作效果是一樣的,但過程更安全。
3. 解決分支沖突
3.1. 創建且使用分支
1 [root@mini05 zhangtest]# git checkout -b feature1 2 Switched to a new branch 'feature1' 3 [root@mini05 zhangtest]# tail -n3 README.md # 最后一行為新加的 4 ccc 5 ddd 6 Creating a new branch is quick AND simple.
添加並提交到本地倉庫
1 [root@mini05 zhangtest]# git add README.md 2 [root@mini05 zhangtest]# git commit -m "RE new line" 3 [feature1 75b1490] RE new line 4 1 file changed, 1 insertion(+)
3.2. 切回到master且新增提交
切換到master分支
1 [root@mini05 zhangtest]# git checkout master 2 Switched to branch 'master' 3 Your branch is ahead of 'origin/master' by 1 commit. 4 (use "git push" to publish your local commits)
在master
分支上把readme.txt
文件的最后添加一行並提交
1 [root@mini05 zhangtest]# tail -n3 README.md # 最后一行為添加 2 ccc 3 ddd 4 Creating a new branch is quick & simple. 5 [root@mini05 zhangtest]# git add README.md 6 [root@mini05 zhangtest]# git commit -m "ma commit" 7 [master 41de15c] ma commit 8 1 file changed, 1 insertion(+)
現在,master
分支和feature1
分支各自都分別有新的提交,變成了這樣
3.3. 合並分支處理
嘗試合並feature1
1 [root@mini05 zhangtest]# git merge feature1 2 Auto-merging README.md 3 CONFLICT (content): Merge conflict in README.md 4 Automatic merge failed; fix conflicts and then commit the result.
查看沖突的文件
1 [root@mini05 zhangtest]# git status 2 # On branch master 3 # Your branch is ahead of 'origin/master' by 2 commits. 4 # (use "git push" to publish your local commits) 5 # 6 # You have unmerged paths. 7 # (fix conflicts and run "git commit") 8 # 9 # Unmerged paths: 10 # (use "git add <file>..." to mark resolution) 11 # 12 # both modified: README.md 13 # 14 no changes added to commit (use "git add" and/or "git commit -a")
直接查看沖突內容並修改
1 [root@mini05 zhangtest]# cat README.md # 查看沖突內容 2 # zhangtest 3 zhangtest 4 張三 5 Git is a distributed version control system. 6 Git is free software. 7 111 8 222 9 Git tracks changes. 10 aaa 11 bbb 12 ccc 13 ddd 14 <<<<<<< HEAD 15 Creating a new branch is quick & simple. 16 ======= 17 Creating a new branch is quick AND simple. 18 >>>>>>> feature1
修改后保留的內容並再次提交
1 [root@mini05 zhangtest]# cat README.md 2 # zhangtest 3 zhangtest 4 張三 5 Git is a distributed version control system. 6 Git is free software. 7 111 8 222 9 Git tracks changes. 10 aaa 11 bbb 12 ccc 13 ddd 14 Creating a new branch is quick AND simple. 15 [root@mini05 zhangtest]# git add README.md 16 [root@mini05 zhangtest]# git commit -m "conflict fixed" 17 [master 56c6e0c] conflict fixed
現在,master
分支和feature1
分支變成了下圖所示:
用帶參數的git log
也可以看到分支的合並情況
1 [root@mini05 zhangtest]# git log --graph --pretty=oneline --abbrev-commit 2 * 56c6e0c conflict fixed 3 |\ 4 | * 75b1490 RE new line 5 * | 41de15c ma commit 6 |/ 7 * 068d030 add test.info 8 * c752e64 add info 9 * 3b7db1c add aaa.txt 10 * c795cfc del aaa.txt 11 * 6d0226b add aaa.txt 12 * b293c46 git tracks changes 13 * 53f0f2e understand how stage works 14 * 65a58f2 add info 15 * d4fb57e Update README.md 16 * e730676 Initial commit
3.4. 刪除之前創建的分支
1 [root@mini05 zhangtest]# git branch -d feature1 2 Deleted branch feature1 (was 75b1490).
4. 分支管理策略【推薦】
通常,合並分支時,如果可能,Git會用Fast forward
模式,但這種模式下,刪除分支后,會丟掉分支信息。
如果要強制禁用Fast forward
模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
下面我們實戰一下 --no-ff
方式的git merge
4.1. 創建並使用分支
1 [root@mini05 zhangtest]# git checkout -b dev 2 Switched to a new branch 'dev'
修改readme.txt文件,並提交.
1 [root@mini05 zhangtest]# tail -n3 README.md # 最后一行為新增行 2 Creating a new branch is quick AND simple. 3 feature2 4 dev brach new 5 [root@mini05 zhangtest]# git add README.md 6 [root@mini05 zhangtest]# git commit -m "dev brach new" 7 [dev ef9042a] dev brach new 8 1 file changed, 1 insertion(+)
4.2. 切回到master並合並分支
切回到master分支
1 [root@mini05 zhangtest]# git checkout master 2 Switched to branch 'master' 3 Your branch is ahead of 'origin/master' by 5 commits. 4 (use "git push" to publish your local commits) 5 [root@mini05 zhangtest]# git branch 6 dev 7 * master
准備合並dev
分支,請注意 --no-ff
參數,表示禁用Fast forward
:
1 [root@mini05 zhangtest]# git merge --no-ff -m "merge with no-ff" dev 2 Merge made by the 'recursive' strategy. 3 README.md | 1 + 4 1 file changed, 1 insertion(+)
因為本次合並要創建一個新的commit,所以加上-m
參數,把commit描述寫進去。
4.3. 用git log看看分支歷史
合並后,我們用git log
看看分支歷史:
1 [root@mini05 zhangtest]# git log --graph --pretty=oneline --abbrev-commit 2 * aadf8b4 merge with no-ff 3 |\ 4 | * ef9042a dev brach new 5 |/ 6 * 31230a8 feature2 7 * 56c6e0c conflict fixed 8 |\ 9 | * 75b1490 RE new line 10 * | 41de15c ma commit 11 |/ 12 * 068d030 add test.info 13 * c752e64 add info 14 * 3b7db1c add aaa.txt 15 ………………
可以看到,不使用Fast forward
模式,merge后就像這樣:
4.4. 分支策略【重點】
在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master
分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是說,dev
分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev
分支合並到master
上,在master
分支發布1.0版本;
你和你的小伙伴們每個人都在dev
分支上干活,每個人都有自己的分支,時不時地往dev
分支上合並就可以了。
所以,團隊合作的分支看起來就像這樣: