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个换行符),所以它的创建和销毁也会异常高效。

 

posted on 2019-01-05 22:48  小白coder  阅读(267)  评论(0编辑  收藏  举报