Git
Git 是一个免费、开源的分布式版本控制系统(Distributed Version Control System, DVCS)。
它的核心作用是跟踪文件的每一次变化,以便于任何时刻查阅历史记录或者回溯到某个版本。
现如今几乎所有软件开发都依赖 Git 进行代码管理和协作,是软件开发领域的绝对标准。
- 性能卓越: Git 的核心部分是 C 语言编写的,具有极高的性能。
- 分布式开发: 每个开发者本地都有完整的版本库,可以在不联网的情况下提交、创建分支、查看历史。
- 强大的分支模型: Git 的分支功能轻量且高效,分支操作速度极快。
- 数据完整性: Git 通过 SHA-1 哈希算法确保内容的完整性。每一次提交、每一个文件都会被校验,任何损坏或篡改都能被立刻发现。你所提交的内容,就是你未来拉取的内容。
- 活跃的社区: Git 拥有庞大而活跃的社区和丰富的工具和托管平台(如 GitHub, GitLab)。
官方站点:https://git-scm.com/
架构组成
从用户的角度看,Git 的架构可以被划分为工作区、暂存区、本地仓库、远程仓库四大区域。
- 工作区:是 Git 管理的的文件目录,这是你编写代码、修改文件的地方。
- 暂存区:是一个索引文件,它像一个购物车,存放着你将来要提交的文件变更。
- 本地仓库:包含项目的所有历史记录、元数据、对象数据库和分支指针。
- 远程仓库:是本地仓库的一个安全异地备份和本地仓库结构上基本一致,也是一个完整的 Git 仓库。
一般的工作流遵循 工作区 → 暂存区 → 本地仓库 → 远程仓库 这一主线,并周期性地从 远程仓库 拉取。
底层实现
一个简单的键值数据库和指针系统,主要存储的数据是一系列的快照 (Snapshots)。
目录结构
运行命令初始化Git目录,此时创建的 .git 文件夹就是 Git 的全部,它包含了 Git 仓库的所有数据。
git init其中的主角是 objects、 index、 refs 和 HEAD。
- HEAD(定位标的文件)
- config
- index(暂存区索引文件)
对象数据库 .git/objects
其中只存储四种类型的对象。所有版本历史都是由这四种对象构成的。
- 数据块对象(Blob):数据块对象是文件内容的快照,用于存储单个文件的二进制内容(V)。每当 git add 一个文件时,Git 会根据其内容计算出一个 SHA-1 哈希值,这就是 Blob 对象的唯一 ID(K)。
- 树对象(Tree、TreeEntry): 树对象是目录结构的快照,用于关联目录文件内容。它包含一个列表,每一项都由 文件模式、对象类型 (blob/tree)、SHA-1 哈希值和文件名组成。
- 提交对象(Commit): 提交对象是项目在某个时间点的完整快照,每个提交对象指向顶级树对象和一个或多个父提交对象,用于将一个顶级树对象与作者、提交信息、时间戳以及父提交关联起来,是历史记录网络中的一个节点。
- 标签对象(Tag): 标签对象本质就是一个简单的引用,用于给某个特定提交的永久性命名。
暂存区.git/index
暂存区本质就是这个索引文件,他就像一个清单,列出了将要提交的所有文件及其状态。暂存区并不直接存储文件内容,而是存储指向文件内容快照的指针。
定位标的.git/HEAD
它就是一个文本文件,它永远指向你当前所在的位置。
引用地址簿.git/refs
.git/refs 目录就是 Git 仓库的“地址簿”,它以文件夹和文件的形式,存储了所有有名字的指针。
- ...
关系图
最后更新于