git文件管理模型和git分支(branch)

git使用起来非常方便,也极其复杂,对于半入门的新手,理解git对文件管理的模型往往有助于加深对git的理解。

1、git文件管理模型

假设在工作目录中有三个文件,准备将它们暂存后提交。暂存操作会对每一个文件计算校验和(即SHA-1 哈希字串),然后把当前版本的文件快照保存到git仓库中(git使用blob类型的对象存储这些快照),并将校验和加入暂存区域。每一次commit操作,git都会建立一个commit对象,该对象包含一个指向tree对象(tree对象的概念后面解释)的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针(首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。)。下面介绍tree对象的概念:实际上,git commit操作在新建一个提交对象前,git会先计算每一个子目录(也就是项目根目录)的校验和,然后在git仓库中将这些目录保存为tree对象(tree对象中记录着其目录中的所有的文件的文件名,文件位置等原信息,根据这些元信息能够找到文件的实际存储位置。)。之后git创建的提交对象,除了包含相关提交信息以外,还包含着指向这个tree对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。

在上面的例子中,工作目录中有三个文件,将它们暂存并提交后会生成5个对象:三个表示文件快照内容的blob对象;一个记录着目录树内容及其中各个文件对应blob对象索引的tree对象;以及一个包含指向tree对象(根目录)的索引和其他提交信息元数据的 commit对象。具体如下图:

git文件管理模型和git分支(branch)_第1张图片

如果修改后再进行提交那么将会生成一个新的commit对象,该对象中会包含一个指向上次提交对象(也就是父对象)的指针。两次提交后,仓库的历史会成为下面的样子:

git文件管理模型和git分支(branch)_第2张图片

2、git分支(branch)

git中的分支(branch),其实本质上仅仅是个指向commit对象的可变指针。git会使用master作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的master分支,它在每次提交的时候都会自动向前移动。从下图可以看出,git中的分支概念是指指向最近一次提交对象的指针,从该提交对象可以追溯项目的提交历史。

git文件管理模型和git分支(branch)_第3张图片

新建分支的命令git branch testing会在距离当前最近的提交对象上新建一个分支指针,命名为testing,也指向该提交对象。

git文件管理模型和git分支(branch)_第4张图片

为了区分,当前在哪个分支工作,git中还会保存一个HEAD指针,指向当前的工作分支。


使用git checkout testing命令,可以将工作分支切换到testing。

git文件管理模型和git分支(branch)_第5张图片

在testing分支上提交之后,用git checkout命令切换回master分支,然后进行提交,可以得到,下图的状态:

git文件管理模型和git分支(branch)_第6张图片


以上就是对git文件管理模型和git分支概念的简单介绍,希望对新手有帮助。

参考文献《Pro Git》

你可能感兴趣的:(git,commit,blob,branch,checkout)