Git简介
一句话总结的说,Git是一个开源的分布式版本控制系统,由Linux内核开发人员开发,现已用来管理android等多个大型项目。
设计目标:
- 快速操作
- 简单设计
- 并行开发(上千个)
- 完全分布式
- 能力超强(类似Linux内核管理)
和SVN
提到版本管理系统,自然会想到SVN,如果你原来是使用tortoiseSVN操作,你现在可以用tortoiseGit,表面上看,你会发现tortoiseGit除了多了几个诸如Push、Pull等命令外,其它基本一致。当然,这只是表面。单从tortoise这个工具来说,tortoiseSVN内嵌了SVN的命令;而tortoiseGit只是个“皮”,负责调用Git的各个命令,这也是在安装tortoiseGit之前要安装Git的原因。
再进一步的说,SVN是集中式的版本控制系统,Git是分布式的版本控制系统,分布式和集中式的差别还是很大的:
- 分布式弱化了集中,强调了“库-库”平等
- 分布式意味着每个人在本地都可以有一个完整的库
- 有完整的库意味着每个人都是一个备份,丢失更容易回复(这也意味着代码容易全盘泄露)
- 有完整的库意味着你大部分操作可以离线操作
- 离线操作意味着速度更快,不用依赖网络
- ……
原理
完整性机制
24b9da6552252987aa493b52f8696cd6d3b00373
对象机制
首先来看一下Git模型设计的一些基本概念:Git设计了几种对象模型,每种对象主要包含了size,type和content。Git中有以下四种主要对象:1. blob: 用于存储数据,一般来说就是文件
2. tree: 与目录很像,保存的是对其它tree、blod的引用
3. commit:指向一个特定的tree,并记录相关的时间、描述等信息
4. tag: tag指向一个特定的commit,它像分支引用,但不会变化
这几种对象的关系如下图所示:
通过这几种对象,Git可以很有条理的管理内容和版本。
存储机制
SVN和Git还有一个很大的差异在于二者的存储机制,以前写过一篇关于SVN 的博客提到,SVN是增量保存的,及每次只保存和上次有差异的部分,如下图:
这样做的好处是可以很大程度上节省硬盘空间,但如果要得到指定版本的文件都要先找到最近的快照,然后合并上改变的部分,所以速度较慢,来看一下Git的存储机制:
Git的存储机制是如果文件有变化,那么就直接再保存一个该文件完整的版本,这种做法的不足之处也显而易见,就是需要更多的硬盘空间;但是好处也很明显:得到指定版本是瞬时的,并且这种机制对于分支、合并的管理非常易操作。
这是一种以空间换效率的方式,大智若愚。
分支原理
在Git中分支和合并异常轻量级的,所以Git鼓励开发者多使用分支和合并。分支和合并的使用时Git很重要的一部分,本文仅作简单介绍,抛砖引玉,详见《Pro Git》。
由上面提到的对象机制和存储机制,可以知道在Git中,多次提交commit后,仓库变为:
而分支即是指向这些commit的指针文件,这个文件就是包含对象校验和(就是上面提到40字节的SHA-1子串)的文件,所谓的新建分支仅仅是向一个文件加入41个字节(还有一个自己的换行符),所以在Git中新建分支非常快速并且廉价。
使用流程
因为Git的机制不同,导致它的操作更灵活,这也促使了更多灵活的管理方式,根据项目大小一般有三种:集中式工作流
它是将代码存放在中心服务器,可以接受所有开发者代码,这种工作流与SVN时的思想一致,适合较小的项目:
集成管理员工作流
Git支持每个开发人员都有自己的远程库,因此可以让官方有一个主库,每个开发人员有一个远程仓库,开发人员向自己的库中更新内容,官方管理员负责收集、选择、整合这些更新到主库:
GitHub上采用最多的就是这种工作流。
司令官与副官工作流
这个是在集成管理员工作流的基础上改进的,一般非常大的项目才会使用,如linux内核开发。这种工作流的核心是在集成管理员工作流的基础上添加了一个超级管理员和若干个管理员,即:多个管理员负责从开发者的远程仓库中收集、选择、整合更新的内容到自己负责的主仓库中,再由超级管理员对管理员集成的内容二次筛选,整合到主库中:
总结
关于Git的内容就说到这里,并不是说Git比SVN更好,没有哪种版本管理更好,也没有哪种工作流程更好,根据当前环境,合适的才是最好的。