分支管理
其他版本控制系统如SVN等都有分支管理,使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。
但Git的分支是与众不同的,无论创建、切换和删除分支,Git都能在瞬间完成。这得益于Git的设计原理十分巧妙,对于这一系列的操作而言,它只需要修改一下指针就能完成。这个我在另一系列教程-《Git机制解析》有详细解读,相信你理解之后会对Git的管理模式更清晰。
创建分支
创建分支前我们先使用git branch
查看一下当前拥有的分支:
$ git branch
* master
结果显示我们当前只有一个master
分支,这是我们最初在执行git init
的时候Git 为我们创建默认的分支。前面的 *
号代表了当前所指向的分支,也就是此处的HEAD
:
在创建新的分之前我们先来看一下当前master
分支中的内容:
$ ls
readme.txt
$ cat readme.txt
无关风月oo
现在我们来新建一个dev
(即开发)分支并且切换到该分支:
$ git checkout -b dev
Switched to a new branch 'dev'
此处带上 -b
就相当于:
$ git branch dev //创建分支
$ git checkout dev //切换分支
Switched to branch 'dev'
然后我们再来查看一下当前的分支情况:
$ git branch
* dev
master
结果显示现在有master
和dev
两个分支,*
号标记了当前所处的分支为 dev
。
然后我们来编辑并查看readme.txt
:
$ cat readme.txt
无关风月oo
分支测试
然后添加到stage
并commit
到版本库中:
$ git add readme.txt
$ git commit -m 'add branch test'
[master 6713cc6] add branch test
1 file changed, 1 insertion(+)
接下来我们在切回到master
分支上并查看刚刚修改的readme.txt
文件:
$ git checkout master
Switched to branch 'master'
$ cat readme.txt
无关风月oo
此时发现修改的内容不见了,还是原来的内容。这是怎么回事呢?
其实那是因为我们的修改与提交都是在dev
上操作的,对master
没有任何影响。当我们再切换回去的时候只是将HEAD
指向master, dev
还是呆在那。也就是干了这么件事情:
合并分支
现在,我们把dev
分支的工作成果合并到master
分支上:
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt
的内容,就可以看到,和dev分支的最新提交是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).
删除后,查看branch,就只剩下master
分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。
小结:
1.git branch
查看分支。
2.git branch dev
创建dev
分支。
3.git checkout dev
切换到dev
分支。
4.git checkout -b dev
创建并切换到dev
分支。
5.git merge dev
将dev
分支合并到当前(master)分支。
6.git branch -d dev
删除dev
分支。