前言
存储
Git的底层存储是以文件快照实现的,对版本的存储是通过文件快照整体进行存储,重复的文件通过指针索引源文件,不重复存储;而非SVN和CVS存储各版本文件之间的差异;
分支
分支(Branch),是Git依靠底层文件快照存储系统为上层服务提供的解决方案;解决项目中同时存在多个父子版本在交叉进行创建版本和合并版本的需求;
分支存在于各个版本库中(本地版本库&远程版本库),个人认为有必要在实际操作之前先了解一下分支的概念;
我们在实际操作中,不论是是在命令行还是在IDEA,都会经常看见类似的关键字:origin、master、origin/master;这些都是跟分支相关的关键字;
存储过程
这一切我们从提交这个操作开始说起:
提交对象
Git针对每次提交都会生成一个提交对象,这个提交对象的内容有:
1、一个指向文件快照的指针;
2、本次提交的相关信息;
3、指向父对象的指针
(该指针为零或多个:初次提交没有父对象,合并操作会有多个父对象);
如上图所示:
三次提交生成提交对象:commitA、commitB、commitC;
每个提交对象都有一个对应的文件快照,该文件快照记录着当前提交完成后版本库的文件状态;
除了第一次提交的commitA之外都有一个指向父对象的指针;
注:示意图中提交对象保存的提交相关信息没有体现;
文件快照
文件快照是Git存储文件状态的blob对象;
实际上提交对象并不是上图所示的直接指向了文件快照;
在生成提交对象时,Git会把文件目录保存整tree对象,然后为每个文件生成文件快照;
提交对象直接指向的是tree对象,tree对象指向的是文件快照;
如上图所示:
commitA:提交了新文件A;
commitB:提交了新文件B,同时保留着文件A;此时不会再为文件A生成新的Blob文件,而是treeB直接指向了BlobA;
commitC:提交了文件A的修改,同时保留着文件B;为文件A生成新的Blob文件BlobA2,同时指向文件B的原BlobB文件;
注:由上图可以很好的理解Git不会为未修改文件重复保存的实现原理;
注2:之后的示意图对于文件快照会直接用一个“snapshot”的概念来标示,不会再细分tree和blob;
分支
什么是分支?
Git将每次提交生成的提交对象以时间顺序链接成一条时间线;
分支的本质是一个动态指针,指向某一个提交节点;
同时,版本库存在一个动态指针HEAD;HEAD指针指向分支,以确定当前操作的是哪个分支;
分支的结构
基本结构
默认分支Master的结构,如图所示:
新建其他分支
新建分支development,并切换至分支development:
分支提交
分支development新增提交commitd-D:
并行提交
主分支Master新增提交commitD:
合并分支
分支切换版本
上述中提到分支的本质的时候写了一段话:“分支的本质是一个动态指针,指向某一个提交节点”;
注意点是“指向某一个提交节点”,而这“某一个提交节点”不仅限于当前分支创建的提交节点,而是版本库中现有的所有提交节点;
例如,上述的分支Master可以将版本移动至分支Development创建的提交节点(Commitd-D)上,如图所示:
大概就是两点
1、分支是指针,不是一条线;
2、提交节点对于所有分支是共享的;
分支的位置
位置示意图
在Git空间示意图中可见,工作区(work directory)对应的版本库中(repository)保存着暂存区(Stage),而版本库中除了暂存区中之外,主要的功能就是保留着各分支信息;
每个版本库在创建的时候默认生成一个主分支,默认命名master;
查看分支
命令行
使用命令查看branch相关的信息;
git branch #查看本地分支列表
git branch -v #查看本地分支列表以及分支相关的提交信息
git branch -vv #比-v增加了各分支对应的远程分支名称
git branch -r #查看远程分支
git branch -a #查看所有分支(本地+远程)
上述命令行查询列表中名称前有 * 号标示的为当前分支;
IDEA
IDEA中查看branch相关信息;
在IDEA中点击控制台右下角下拉框“Git 《branch name》”,出现分支列表;
其中:
当前分支名称:下拉框的名称也就是当前分支名称,这个跟下拉框底部有描述“Current branch 《branch name》”;
本地分支列表和对应的远程分支:如图所示,Local Branches中展示的为本地分支列表(除了当前分支之外);并且“->”左侧为本地分支名称,右侧为该本地分支对应的远程分分支;
Smart
Git在做版本控制的方面是聪明和快捷的;
聪明:并且由于文件快照存储系统的良好支持;使得在创建分支和合并分支以及版本回退时的代价降到了最低,达到了轻量级的效果;
快捷:由于上述的在进行分支的创建和修改时代价很低;而给我们使用者最直观的印象就是快捷;“一秒建分支”“一秒合并分支”;
由于Git中分支概念的存在,将版本管理的功能范围又提高了一个次元,使得可以在实际操作中快速灵活的管理多个同时独立存在的子版本;
Git也鼓励在实际使用中创建分支和合并分支;
结尾:上述就是文本的全部内容,关于分支的其他操作请参考后续文章;