Git的分支,本质上仅仅是指向提交对象的可变指针。Git的master分支并不是特殊分支,它与其他分支没有区别,之所以几乎每个仓库有master分支,是因为git init命令默认创建它,并且大多数人都懒得去改动它。如果想在开发过程中想创建分支进行相关操作,可进行如下操作:
分支创建命令:
$ git branch testing
表示在当前所在的提交对象上创建一个名为testing的分支。
图1 创建testing分支
图1表示三次提交历史,当前提交对象为f30ab(这是SHA-1校验和的简短表示,每个提交对象都会有对应的校验和,Git用以计算校验和的机制叫做SHA-1散列,它是由40个十六进制(0-9,a-f)组成的字符串,基于Git中文件的内容和目录结构计算出来,git数据库中保存的文件信息都是以文件内容的哈希值来索引,而不是文件名),此时master和testing两分支都指向f30ab。
图中Head是一个特殊指针,指向当前所在的本地指针,也可将head想象成为当前的分支的别名,如本例中head指向master分支,说明此时依旧在master分支。注意,使用上述命令创建分支并不会自动切换到新分支上,如果想切换分支,可以利用
$ git checkout testing
命令来切换分支(但是,在这么做之前,要留意工作目录和暂存区里那些还没有被提交的修改,它可能会和即将检出的分支产生冲突,从而阻止git切换到该分支。最好的方法是,在切换分支之前,保持好一个干净的状态。 有一些方法可以绕过这个问题(即保存进度(stashing) 和 修补提交(commit amending)))。此时,head指针便指向testing分支。
图2 切换分支
head分支会随着提交操作自动向前移动,为了说明这一现象,可以再次提交一个任务,
图3 head分支向前移动
如图3所示,在分支为testing情况,提交一个任务,此时testing分支向前移动了,但是master分支没有,此时切回master分支时
$ git checkout master
图4 检出时head随之移动
这条命令做了两件事,一是head指向master分支,二是将工作目录恢复成master分支所指向的快照内容,即如果现在做修改的话,项目将始于一个较旧的版本。本质上讲,就是忽略testing分支所做的修改,以便向另一个方向进行开发。
还有一种带-b的切换分支命令,表示在创建分支testing的同时,切换分支到testing
$ git checkout -b testing
等价于
$ git branch testing $ git checkout testing
由于git分支实质上仅是包含所指对象校验和(长度为40的SHA-1值字符串)的文件,创建一个分支就相当于往一个文件中写入41字节(40个字符串+1个换行符),所以它的创建和销毁也会异常高效。