什么是Git?
Git是一个分布式的版本控制系统,Git通过版本库来管理数据(代码),严格来说 他是一个对象数据库。
Git中提交对象非常重要,我们通过它记录代码提交过程,进行文件保存、回退等操作,那么他是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的.git文件夹中
新建空项目gitDemo使用git init初始化,在文件夹根目录下会生成.git文件夹,在文件夹中会生成以下内容
|——.git/
| |——hooks/
| |——info/
| |——objects/
| |——info/
| |——pack/
| |——refs/
| |——config/
| |——description/
| |——HEAD/
此时在项目下新建index.js文件,增加一行代码;并执行git add 操作,为方便观察,目录结构只保留.git文件夹下的objects中的内容
const num =1;
可以看到在这次添加到暂存区的操作后,objects文件中增加了一个23文件夹,并多出了一个以8bdc开头的哈希值,使用git cat-file -t查看文件类型,git cat-file p查看文件具体保存的内容
8bdc开头的哈希值文件是以二进制的形式保存着git add 提交的文件内容
再执行git commit 操作生成了一个哈希值为13d5976的校验和
在objects文件中生成了13 81两个文件夹
再次使用 git cat-file 查看两个新增的文件夹内容
81文件夹da9a文件记录着哈希值+文件的一组值,指向的就是 git add 的记录及对应的文件。
13文件夹d597文件以树结构的形式记录着 git commit 的操作记录,包含提交者姓名邮件等信息,其中提交后展示的校验和 13d5976 也就是指向这个文件。
以上只有一次提交 如果提交多次文件如何进行关联呢?
继续在index.js文件中添加以下代码:
function add (a,b){
return a+b;
}
79acae文件保存的是整个index.js的内容
查看两个文件的内容,与第一次提交大体一致,但是在保存提交对象的 8b1ab6 文件中新增了一个 parent 属性,指向的是上一次提交对象 13d597。
上述提交到缓存区的文件都只有一个,所以在提交对象中保存的记录也只有一条,如果修改的文件存在多个,就会创建多个文件夹来保存修改的文件。
每一次 commit 提交都是一个 commit 对象,通过40位的哈希校验和,可以找到 tree 对象,它也是一个校验和,通过这个校验和可以找到这次提交依赖的所有文件(二进制)并还原成真实文件。