git实战-3、git工作原理
前言
要想用好git,了解其工作原理是必不可少的,以下我们可以带着以下两个问题去理解git原理。搞清楚两个问题:
- git文件结构是怎么样?
- commit提交git发生了什么?
git 文件目录
• COMMIT_EDITMSG
• config 当前 git 的配置文件
• description (仓库的描述信息文件)
• HEAD (指向当前所在的分支),例如当前在 develop 分支,实际指向地址是 refs/heads/develop
• hooks [文件夹]
• index
• info [文件夹]
• logs [文件夹]
• objects [文件夹] (存放所有的 git 对象,对象哈希值前 2 位作为文件夹名称,后 38 位作为对象文件名, 可通过 git cat-file -p 命令,拼接文件夹名称+文件名查看)
• ORIG_HEAD
• refs [文件夹]
• heads (存放当前项目的所有分支)
• tags (存放的当前项目的所有标签,又叫做里程碑)
cat 命令, 功能:用来显示文件。 例如 cat text.md 显示 text.md 文件的内容
ls -al 命令, 表示列出当前目录下的所有文件(包括隐藏文件)
git cat-file -t 命令 , 查看 git 对象的类型
git cat-file -p 命令, 查看 git 对象的内容
git cat-file -s 命令, 查看 git 对象的大小
commit过程详解
Git对于内容相同的文件只会存一个blob,不同的commit的区别是commit、tree和有差异的blob,多数未变更的文件对应的blob都是相同的,这么设计对于版本管理系统来说可以省很多存储空间。其次,Git还有增量存储的机制,我估计是对于差异很小的blob设计的吧。
git中的文件夹确实就是用tree组织的。从现有知识来看,可以把tree对应于文件夹对象
实践过程
1、以下命令是初始化一个库,然后新增一个文件之后进行commit。
git init watch_git_object
mkdir doc
cd doc
echo “hello” > readme
git status
cd …
git add doc
git status
find .git/objects/ -type f
app@iz8vb2knpxzlk1syb8dy3cz watch_git_object]$ find .git/objects/ -type f
.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
git commit -m"test"
[app@iz8vb2knpxzlk1syb8dy3cz watch_git_object]$ find .git/objects/ -type f
.git/objects/31/5f8050b11704358140f3f25f4ae682d631f7df
.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
.git/objects/6e/17e26237e12bc64cad4af1d9ddd8e8969d8111
.git/objects/76/982b78fe11a72b79c0f4c02cbf0474248f2077