git的基本原理
Difference between git and VCS
区别制版本时,会关心文件内容的具体差异,每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。
上图是传统VCS,在控制版本时,会关心文件内容的具体差异,每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。
这是git的版本控制,在版本控制中,只储存发生变化的文件,没有变化的文件并不重新储存,git通过对文件的校检来发现改变。
Git Repository
一个Git仓库包括一下三个部分
- .git文件夹,这里储存版本控制信息(Configuration Management Database,CMDB)
- Working directory 工作目录,是本地文件系统
- staging area 暂存区
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中
分别对应已修改(modified),已暂存(staged),已提交(committed)
Git Object Graph
对分支的理解决定了对Git原理的理解
每次commit会提交一个commit对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。
- commit对象:包含指向 tree 对象(根目录)的索引和其他提交信息元数据
- tree对象: 记录着目录树内容及其中各个文件对应 blob 对象索引
- blob对象:表示文件快照内容
每次提交的对象会包含指向parent对象的指针(首次提交除外),parent一般是之前提交的对象。
通过指针,来形成多个分支,head指针指向当前工作的分支,每次提交,当前工作分支会自动移向新提交的对象
分支合并示意,分支合并一般会涉及三个提交对象,合并策略可选