GitHub学习记录5-内部原理
GitHub学习记录5
Git 内部原理
本地仓库下有个名为 .git 的隐藏目录
.git 的目录结构
.git的目录结构如下:
1 | ├── *config 配置信息(比如本地repo是否大小写敏感, remote端repo的url, 用户名邮箱等) |
objects目录 —— 对象存储
objects目录下存储三种对象:数据对象(blob),树对象(tree)和提交对象(commit)
运行以下命令:
- echo命令:向文本文档打印内容
- mkdir命令:创建文件夹
此时objects目录里会多出五个子目录(初始仓库为空):
1 | .git/objects |
Git如何存储对象?
-
Git会根据对象内容生成一个 SHA-1 哈希值(称为该文件的校验和)
例如:
40fa006a9f641b977fc7b3b5accb0171993a3d31 -
截取校验和的前两个字符 => 用于命名子目录
例如:
40 -
校验和余下的 38 个字符 => 用于文件名
例如:
fa006a9f641b977fc7b3b5accb0171993a3d31 -
将对象内容存储在
子目录/文件名内
在上面的例子中,5个子目录含义如下:
objects目录 —— 包文件的存储机制
Git最初向磁盘存储对象时采用"松散"对象格式;但为了节省空间和提高效率,Git会时不时将多个对象打包成一个称为"包文件"。
当版本库中有太多的"松散"对象,或者手动执行 git gc 命令,或者向远程服务器执行推送时,Git 都会进行打包
1 | git gc |
refs目录 —— 引用
Git把一些常用的 SHA-1 值存储在文件中,用文件名来替代,这些别名就称为引用。有三种引用类型:heads, remotes和tags。
HEAD引用
HEAD引用有两种类型
| 存储位置 | 指代内容 | 文件内容 | |
|---|---|---|---|
| 分支级别 | .git/refs/heads目录下 |
本地分支的最后一次提交- 有多少个分支,就有多少个同名的HEAD引用 | commitHash |
| 代码库级别 | .git/HEAD文件 |
指代当前代码所处的分支;拓展:也可指代commitHash(称为分离HEAD) | 符号引用 - 例如 ref: refs/heads/master |
远程引用
- 存储位置:
.git/refs/remotes目录下 - 指代内容:远程仓库各分支的最后一次提交
- 注意点:用于记录远程仓库;文件是只读的,乱改就崩了
标签引用
tag主要用于发布版本的管理:一个版本发布之后,我们可以为git打上 v1.0 v2.0 … 这样的标签
- 存储位置:
.git/refs/heads目录下 - 指代内容:tag可以指向任何类型(更多的是指向一个commit,赋予它一个更友好的名字)
- 文件内容:SHA-1值
config文件 —— 引用规范
引用规范由 git remote add origin 命令自动生成
- 获取远端
refs/heads/下的所有引用 - 将其写入本地的
refs/remotes/origin/中 - 更新本地的
.git/config文件
一些常用命令:
| 命令 | |
|---|---|
| 连接远程仓库 | git remote add <远端名origin> <url> |
| 拉取分支 | git fetch <远端名origin> <远端分支名>:<本地分支名> |
| 将远程的 main 分支拉到本地的mymaster 分支 | git fetch origin main:mymaster |
| 将本地的master分支推送到远端的topic分支 | git push origin master:topic |
| 删除远端分支topic | 法1:将git push origin :topic 法2:Git v1.7.0新语法 git push origin --delete topic |
config文件 —— 环境变量
Git有三种环境变量:
1)系统变量
- 适用范围:对所有用户都适用
- 命令选项:
git config --system
2)用户变量
- 适用范围:只适用于该用户
- 命令选项:
git config --global
3)本地项目变量
- 适用范围:只对当前项目有效
- 命令选项:
git config --local - 存储位置:
.git/config
一些常用命令:
| 命令 | |
|---|---|
| 查看所有配置 | git config --list |
| 配置用户名 | git config --global user.name "你的用户名" |
| 配置邮箱 | git config --global user.email "你的邮箱" |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星辰微光的博客!






