Git起源
Git是一个分布式版本控制系统,缔造者是大名鼎鼎的林纳斯·托瓦茲 (Linus Torvalds),Git 最初的目的是为了能更好的管理 Linux 内核源码。
如果说Linux项目促成了开源软件的成功并改写了软件行业的格局,那么Git则是改变了全世界开发者的工作方式和写作方式。
请务必记住Git这三种状态:
- 已提交(committed),表示数据已经安全的保存在本地数据库中
- 已修改(modified),表示修改了文件,但还没保存到数据库中
- 已暂存(staged),表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
Git的三个工作区域:
- Git仓库,用来保存项目的元数据和对象数据库
- 工作目录,对项目的某个版本进行独立提取
- 暂存区域,保存了下次将提交的文件列表信息,也可以叫“索引”
Git的工作流程是:
- 在工作目录中修改文件
- 暂存文件,将文件的快照放入暂存目录
- 提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录
内容实现
本文思路是先理解Git的实现,这样对Git的使用会更容易。
Git的本质是一系列的文件对象集合,代码文件是对象、文件目录树是对象、commit也是对象。这些文件对象的名称即内容的SHA1值,SHA1哈希算法的值为40位。Linus将前两位作为文件夹、后38位作为文件名。可以在.git目录里的objects里看到有很多两位字母/数字名称的目录,里面存储了很多38位hash值名称的文件,这就是Git的所有信息。
BLOB:即二进制对象,就是Git存储的文件。存储文件在每一个版本的完全信息。仅记录文件的内容。
TREE:目录树对象。是一个时间切片中的目录树信息抽象,包含了文件名、文件属性及BLOB对象的SHA1值信息。
CHANGESET:即Commit对象。一个CHANGESET对象中记录了该次提交的TREE对象信息(SHA1),以及提交者、提交备注等信息。CHANGESET中会记录父节点CHANGESET对象的SHA1值,通过比较本节点和父节点的TREE信息来获取差异。
Git分支
Git的显著优点,就是版本的分支(branch)和合并(merge),用起来十分方便。
Git的分支操作只生成一个指向当前版本(又称快照)的指针,非常快捷易用。
同时如果不加注意,很可能会留下很多枝枝蔓蔓的版本库,到处都是分支,完全看不出主干发展的脉络。
因此Git是有好的分支策略的。
-
主分支Master
代码库有且只有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
Git主分支默认叫做Master。是自动建立的,版本库初始化以后,默认是在主分支在进行开发。
-
开发分支Develop
日常开发应该在另一条分支上完成。把开发用的分支叫做develop。
如果想正式对外发布,就在Master分支上,对Develop分支进行合并(merge)。
-
除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:功能分支、预发布分支、修补bug分支
- 功能分支:为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。
- 预发布分支:合并到Master分支之前,我们可能需要有一个预发布的版本进行测试。
- 修补bug分支:软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。