git branch
查看分支
git branch dev
创建名字为dev的分支
git checkout dev
切换分支
git checkout -b
dev创建并切换分支
git merge dev
合并dev分支
git branch -d dev
删除dev分支
git log --graph --pretty=oneline --abbrev-commit
可以查看分支合并图
git merge --no-ff -m "merge with no-ff" dev
可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
创建和合并分支
创建分支并转到dev分支
git checkout -b dev
相当于下面两个命令
git branch dev
git checkout dev
查询分支
git branch
提交文档
git add readme.txt
git commit -m "add readme.txt"
切换到master分支
git checkout master
合并dev分支并删除dev
git merge dev
git branch -d dev
具体过程如下连接
http://liaoxuefeng.gitee.io/git-resources/master-and-dev-ff.mp4
解决冲突
合并分支有时会有冲突,下面例子做演示
创建并跳转分支
git checkout -b feature1
修改readme.txt为以下
Creating a new branch is quick AND simple.
在新分支做修改文件并提交,然后跳转回master分支
git add readme.txt
git commit -m “AND simple”
git checkout master
修改readme.txt为以下
reating a new branch is quick & simple.
在master上提交
git add readme.txt
git commit -m "& simple"
合并两个分支
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
发生冲突,需要解决合并问题,使用git status 查看冲突文件
$ git status小姐
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
查看readme.txt内容
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
对于上面冲突部分我们对其修改,再做提交。就可以解决冲突了。
$ git add readme.txt
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed
用带参数的git log 也可以查看解决冲突情况
$ git log --graph --pretty=oneline --abbrev-commit
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple小姐
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file
最后删除分支
git branch -d feature1
小结:
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
分支管理策略
正常合并分支使用的是fast forward模式,即调整指针合并。如果不使用这个模式,我们可以强制禁止这种模式,git就会在merge时生成新的commit,这样就能看到分支信息
实战,使用--no-ff方式的git merge
创建分支
git checkout -b dev
修改readme.txt提交
$ git add readme.txt
$ git commit -m "add merge"
[dev f52c633] add merge
1 file changed, 1 insertion(+)
现在,我们切换回master:
$ git checkout master
Switched to branch 'master'
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
合并后,我们用git log看看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
...
可以看到,不使用Fast forward模式,merge后就像这样:
image.png
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
image.png
网友评论