作者回复: 很好的问题!我们10号视频对象关系那一节提到blob,Git对于内容相同的文件只会存一个blob,不同的commit的区别是commit、tree和有差异的blob,多数未变更的文件对应的blob都是相同的,这么设计对于版本管理系统来说可以省很多存储空间。其次,Git还有增量存储的机制,我估计是对于差异很小的blob设计的吧。
作者回复: 👍
作者回复: 只要git不报错,都行啊
作者回复: git中的文件夹确实就是用tree组织的。从现有知识来看,可以把tree对应于文件夹对象。
作者回复: 好问题,稍等。不好意思,让你等了这么久。
https://github.com/gotgit/gotgit/blob/master/02-git-solo/030-head-master-commit-refs.rst
当年《Git权威指南》,现在作者开源了。这节的内容当下还是适用的
作者回复: Google或者必应的国际版 里面搜索“git how to check whether blob content changed” --> 点击 “http://www-cs-students.stanford.edu/~blynn/gitmagic/ch08.html” ,web页面里面搜索“whether a file has changed” 。看来Git先把文件的大小、创建时间、最后修改时间信息放在index里面,只要把当前的状况和index的内容做比较,就能判断blob是否变更了。
作者回复: 换个思路想,如果我们自己是Linus,在设计版本管理工具的时候,会不会考虑把内容相同的文件当做一个对象来处理呢?还是说不同分支,即使内容相同也存为不同的对象?
Linus选择的是前者,甚至于不同的git仓库,只要内容相同的文件,其blob的HASH值也是相同的。大家可以做实验验证一下。
作者回复: 👍,理解到位
作者回复: 1. 理解正确。
2.方法可能不止一种,我现在提供给你一种:
git cat-file -p 某个commit的hash
git cat-file -p 该commit对应的tree的hash
作者回复: 你还没有创建commit的话,是没有tree的。先建立一个commit出来。
作者回复: 👍
作者回复: blob用来存储文件内容的,同一个blob可以出现在不同的tree里面,不同的tree可以包含相同的blob。
作者回复: author和committer的内容在后面github视频课里面还会讲。既然一个commit设计两个角色,git应该不是画蛇添足。
第二个问题,说白了就是内容相同的文件,不管文件名叫什么,在git眼里只是一个blob。
作者回复: 不用担心的,找得回来的。如果删除的文件还没有生成commit,你用git status 看一下,它有说明教你怎么恢复文件的。
用 git reset HEAD -- 被删除的文件 ,这样试试看,能恢复不?
作者回复: 直白一点:就是你在本地还没存入版本库的修改,都不想保留,对吧?
那就执行 git reset --hard 吧。请三思后再执行
作者回复: 😄,是我自己边理解边画的。有没有这种工具我没查过,不好下结论啦。