为什么需要分支
分支,就是一个完整的项目中,平行的几个代码仓库,开发的时候,多人分开开发,最后合并成完整的功能。
分支可以使多人协作更加安全,不会因为每个人的进度和功能块不同儿相互影响。
分支原理
通常情况下,我们单分支管理项目代码的时候,只有 master 一个分支,每一次提交都是一个节点,master 则指向我们提交代码的节点,用于标记当前快照的 HEAD 就指向 master。
假设我们创建新的分支 dev,那么就会多一个 dev 指针,指向我们提交代码的节点,HEAD 改为指向 dev ,所以 git 中创建分支是很快的。如果我们需要合并分支,那么重新用 master 指向我们提交代码的节点,HEAD 指向 master 就完成了,所以在 git 中 ,合并分支也是很轻松快速的。
如果不再需要 dev 分支,则删除 dev 指针,代码没有任何变动。
创建分支
使用 git branch
查看分支情况
$ git branch
* master
使用 git branch dev
创建分支 和 git checkout dev
切换分支。git checkout -b dev
创建并且切换分支到 dev。
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
M README.md
$ git branch
* dev
master
使用 git branch
查看分支,我们发现现在有两个分支了,并且当前分支为 dev(当前分支前会加上 *)。
在 dev 分支上修改 README 文件并且提交。
$ git add .
$ git commit -m "commit dev"
[dev 1895051] commit dev
1 file changed, 1 insertion(+), 1 deletion(-)
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
此时我们去查看 README 文件,并没有我们刚才的修改内容,为什么呢?因为我们的修改是提交到了 dev 分支上面,而 master 分支没有做任何改动。
合并分支
合并 dev 分支到 master 分支。
$ git merge dev
Updating a6de0c0..1895051
Fast-forward
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。再次查看 README 文件,我们刚才在 dev 分支上的修改出现了。
分支已经合并完成,那么可以删除分支了。
$ git branch -d dev
Deleted branch dev (was 1895051).
$ git branch
* master
现在又只剩下一个 master 分支了。
总结
Git鼓励大量使用分支:因为更加安全而不影响效率。
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突
重新创建分支 dev , 修改 README 文件,提交。
$ git checkout -b dev
$ git add .
$ git commit -m "commit dev"
然后切换回master分支,修改 README 文件,提交。
$ git checkout master
$ git add .
$ git commit -m "commit master"
合并分支,重现冲突的情况。
$ git merge dev
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
看看 README 文件中冲突的地方:
<<<<<<< HEAD
重现冲突的情况 master++
=======
重现冲突的情况 dev+
>>>>>>> dev
git 使用 <<< , ====, >>> 区分开冲突的文件。HEAD 表示当前分支。这时候,我们需要手动将冲突的地方进行修改,这里我们决定最终采用 重现冲突的情况 master++
,删除文中的符号和我们丢弃的内容。
重现冲突的情况 master++
提交并且再次合并再次合并
$ git add .
$ git commit -m "merge"
$ git log --graph
* commit f8302135fc340de7569d4df48f8ab2323025d7a2 (HEAD -> master)
|\ Merge: 34ed366 fe4a7e8
| | Author: Shanks <chentu_2011@163.com>
| | Date: Wed Jul 4 14:47:53 2018 +0800
| |
| | merge
| |
| * commit fe4a7e852cbc69b82561ecdae14e86fbd1627a40 (dev)
| | Author: Shanks <chentu_2011@163.com>
| | Date: Wed Jul 4 14:41:27 2018 +0800
| |
| | dev
| |
* | commit 34ed366f6204012c3cbe3de8cda02f2380c3a440
|/ Author: Shanks <chentu_2011@163.com>
| Date: Wed Jul 4 14:42:18 2018 +0800
|
| master
使用 git log --graph
可以查看我们分支合并图。
最后删除分支
$ git branch -d dev
Deleted branch dev (was fe4a7e8).
总结
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
网友评论