Git快照(snapshot)到底该如何理解?或者说如何从文件系统的角度理解快照(snapshot)?
当保存一个文件的时候,git 把这个文件的信息和这个文件的内容存储在一个文件里,然后求得这个文件的 sha1 作为文件名(sha1的前两位/sha1剩余部分,见.git/objects)。
保存一个目录,就是把目录信息,以及其中文件通过上述方式求得的 sha1 保存在一个文件里,同样求得这个文件的sha1 作为文件名。
一个提交就是,把提交的信息(比如父提交的sha1等),以及此次提交所包含的目录/文件的上述方式求得的 sha1 放在一个文件里,然后把其 sha1 作为文件名。
当提取某次提交的时候,需要给出某次提交的 sha1 然后 git 就可以通过sha1 找到这个保存这个提交所在的文件,然后这个文件里有其所有包含文件的 sha1 ,然后就可以找到所有文件。
分支的名称其实就是某次提交 sha1 的一个别名而已(见./git/refs/heads)
如果提交 a 和提交 b 都包含同一个文件file,那么,file 以及其信息放在一个文件里,然后 a 和 b 里面其实仅仅保存了这个文件的 sha1
在 git 里面,如果仅仅改变一个文件的文件名(包括改变目录),那么 git add ; git status 是可以看到 git 是可以检测到这个重命名的。 因为他们的 sha1 是相同的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。