今天早上画了一幅git的工作原理图,对应的repository在我的Github上,有兴趣的话可以clone下来对照着看。
简单解释一下这张图吧:
1. git里commit,tree,blob是不同类型的object(第四种object是tag,这里不涉及)。
2. 每个object,不论类型,都有一个唯一ID,是一个SHA-1值。
3. tree对象用来记录一个目录的内容(包含的文件,子目录,以及他们的object id),blob对象用来某个文件特定版本的内容(不记录文件名,仅有文件内容)。
4. 每一个commit(除第一个外)都会记录parent commit(父提交),这样就可以从提交历史中的任何一个commit追溯到整个repository的第一个commit,形成一个完整的提交历史。
5. 每一个commit都会记录一个tree,这个tree就是本次提交的目录树中的顶层目录。
6. git会通过tree对象递归的(上一层tree对象会记录子目录的引用)找出所有子目录及 文件。
7. 文件名和blob对象的映射被记录在tree对象中,而不是blob对象中。
8. 多个不同文件名但是内容相同的文件只在repository中存储1份,不同的文件名在不同的tree对象中会引用同一个blob对象。
一图胜千言
回复删除