首页 > 代码库 > Git基础
Git基础
Git简单介绍
一句话总结的说,Git是一个开源的分布式版本号控制系统,由Linux内核开发者开发,现已用来管理android等多个大型项目。
设计目标:
- 高速操作
- 简单设计
- 并行开发(上千个)
- 全然分布式
- 能力超强(类似Linux内核管理)
和SVN
提到版本号管理系统,自然会想到SVN,假设你原来是使用tortoiseSVN操作,你如今能够用tortoiseGit。表面上看。你会发现tortoiseGit除了多了几个诸如Push、Pull等命令外,其他基本一致。当然。这仅仅是表面。
单从tortoise这个工具来说,tortoiseSVN内嵌了SVN的命令;而tortoiseGit仅仅是个“皮”。负责调用Git的各个命令,这也是在安装tortoiseGit之前要安装Git的原因。
再进一步的说,SVN是集中式的版本号控制系统,Git是分布式的版本号控制系统,分布式和集中式的区别还是非常大的:
- 分布式弱化了集中。强调了“库-库”平等
- 分布式意味着每一个人在本地都能够有一个完整的库
- 有完整的库意味着每一个人都是一个备份,丢失更easy回复(这也意味着代码easy全盘泄露)
- 有完整的库意味着你大部分操作能够离线操作
- 离线操作意味着速度更快,不用依赖网络
- ……
原理
完整性机制
在Git中,全部保存在Git中的内容都是用此哈希码作为索引的,所以在有关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的机制不同,导致它的操作更灵活,这也促使了很多其它灵活的管理方式。依据项目大小一般有三种:集中式工作流
它是将代码存放在中心server。能够接受全部开发人员代码,这样的工作流与SVN时的思想一致,适合较小的项目:
集成管理员工作流
Git支持每一个开发者都有自己的远程库。因此能够让官方有一个主库,每一个开发者有一个远程仓库,开发者向自己的库中更新内容,官方管理员负责收集、选择、整合这些更新到主库:
GitHub上採用最多的就是这样的工作流。
司令官与副官工作流
这个是在集成管理员工作流的基础上改进的,一般很大的项目才会使用。如linux内核开发。这样的工作流的核心是在集成管理员工作流的基础上加入了一个超级管理员和若干个管理员。即:多个管理员负责从开发人员的远程仓库中收集、选择、整合更新的内容到自己负责的主仓库中,再由超级管理员对管理员集成的内容二次筛选,整合到主库中:
总结
关于Git的内容就讲到这里,并非说Git比SVN更好。没有哪种版本号管理更好,也没有哪种工作流程更好,依据当前环境,合适的才是最好的。
Git基础操作
《Pro Git》
《Git使用手冊》
Git基础