git是一个文件寻址系统,什么是文件寻址?其实我也不是很理解,哈哈哈.....
Git 的底层存储从本质上讲是基于本地文件系统实现的 Key-Value 数据库. 这里的 Value 是 git 里的三种不同的对象的内容, 而 Key 则是对象内容的 hash 值
git对象有tag、blob、commit、tree,在这里我们只需要关注后三个对象。
其中blob是最基本的存储单元。git在提交时会生成commit,commit是一个快照,记录着该时刻所有文件的状态。而每个commit都是指向tree的,如下:
git log
查看commit内容
git cat-file -p c6298e6493a3096dc5dd9
这里可以看到一个tree对象,然后再查看这个tree
git cat-file -p ba65d80b3655f4
这里可以看到一个blob对象,再次查看这个blob对象
git cat-file -p ea4fff75dac5abe33d1ac53
到这里就是最底层的blob对象,也就是对应文件的内容。
由以上数据可以看出,每次commit都会生成三个对象,commit、blob、tree,最顶层的tree就是项目的跟目录,每个tree和blob都有一个hash值而且都是唯一的。commit的hash值指向tree,tree的hash值指向tree下的blob或者tree,blob的hash值指向文件的内容。
blob是最基本的存储单元,当文件发生变化是,就会生成新的hash值,那么它上层的tree的hash值也会发生变化。一直影响到顶层的tree。在每次提交时,如何文件的内容不发生变化,该文件就不会再次保存(也就是不会生成新的hash,还是用之前的)。
git存储文件只看内容;根据内容生成hash值;基于底层的blob名构建不同的tree;
在每次提交的时候会根据hash值检索所有的文件,生成新的hash值保存快照。