给那些不怕类似“有向无环图”这样字眼的人简单介绍一下git的内部实现。 存储: 简单的说,git的对象存储就是一堆对象的有向无环图,一堆被分成几种类型的对象。这些对象都压缩存储,并且以其自身的SHA-1哈希值作为唯一标示。(顺便说下,这个哈希值不是对象所表示文件内容的SHA-1,而是对象本身在git中的表示。原文:that,incidently,isn’t the SHA-1 of the contents of the file they represent,but of the representation in git). blob:最简单的对象,一些字节而已。可能是一个文件,也可以是一个符号链接或者类似的其他东西。指向blob的对象定义了git中的语义(看到后面大家会理解)。 tree:目录被表示成tree对象。他们指向了包含文件内容的blobs(文件名,访问权限等呗保存在tree对象里),和其他tree对象(代表了子目录)。
再一个有向无环图里,如果一个节点指向另外一个节点,那么被指向节点就依赖指向它的那个节点:没有指向节点,被指向节点就不能存在。没有被指向的节点会被当成垃圾,或被git gc回收,或使用git lost-found复原(这点和文件系统把没有文件名指向的inode放到lost+found目录供以后恢复类似)。 commit:一个commit指向一个tree对象,这个tree对象代表了commit发生当时的文件状态。commit可以指向0..n个其他的commit作为他的父亲节点。如果commit有多个父亲节点,那意味着这个commit是一个merge;没有父亲节点意味着该commit是一个initial commit。有趣的是git允许有多个initial commit,这意味着多个project的merge。commit对象的主体是commit信息(message)。 |