git 学习笔记<Version Control With Git>

好记性不如烂笔头, 今天理解并记住, 并不保证下次想用的时候还能理解

  1. git object store 存储4类: blob, tree, commit, tag;
  2. blob 存储的是文件的内容, 并被压缩, 算出 hash 为160bit, 40位16进制数字, 前2位作为文件夹名, 后面做文件名;
  3. git 是以内容寻址的, 只要内容一样, 生成的 blob 对象是一个;
  4. tree 相当于 linux 文件系统的 node, 存储系统某个文件夹结构. 它指向该文件夹下面的 blob 文件和 文件夹 tree;
  5. git cat-file -p [commit id | hash value] 可以看commit, tree, blob 的内容;
  6. 当某文件改变之后, 如果 commit, 那么该文件将会出现一个新的 blob 对象, 那么它上面文件夹对应的 tree 也会为了反映新的变化, 而出现一个新的 tree, 对应的, 递归向上, 直到 git 管理的顶层文件夹, 对应的 tree 都会出现新的一份. 没有改变的文件/文件夹的 hash 值没变, 那么他们对应的 blob 和 tree 都没有变, 新的 tree 还是指向它文件夹下的这些原有而没变的blob, tree 对象.
  7. 每个 commit 仅仅指向最顶层的 tree 对象, 每次有新的 commit, 最顶层的 tree 都会有新的一份. 并且每个 commit 都会指向它之前的 commit, 称之为 parent commit;
  8. 因为每个 commit 都指向最顶层的 tree, 那么顺藤摸瓜, 每个 commit 都能顺着顶层的 tree 找到当时的所有文件/文件夹的 snapshot;
  9. index/stage/cached 要么指向 HEAD 指向的 blob/tree, 要么指向 add 的 blob/tree;

标签: none

添加新评论