Skip to Content

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

其中的主角是 objectsindexrefsHEAD

    • HEAD(定位标的文件)
    • config
    • index(暂存区索引文件)

对象数据库 .git/objects

其中只存储四种类型的对象。所有版本历史都是由这四种对象构成的。

  1. 数据块对象(Blob):数据块对象是文件内容的快照,用于存储单个文件的二进制内容(V)。每当 git add 一个文件时,Git 会根据其内容计算出一个 SHA-1 哈希值,这就是 Blob 对象的唯一 ID(K)。
  2. 树对象(Tree、TreeEntry): 树对象是目录结构的快照,用于关联目录文件内容。它包含一个列表,每一项都由 文件模式、对象类型 (blob/tree)、SHA-1 哈希值和文件名组成。
  3. 提交对象(Commit): 提交对象是项目在某个时间点的完整快照,每个提交对象指向顶级树对象和一个或多个父提交对象,用于将一个顶级树对象与作者、提交信息、时间戳以及父提交关联起来,是历史记录网络中的一个节点。
  4. 标签对象(Tag): 标签对象本质就是一个简单的引用,用于给某个特定提交的永久性命名。

Git实体关系

暂存区.git/index

暂存区本质就是这个索引文件,他就像一个清单,列出了将要提交的所有文件及其状态。暂存区并不直接存储文件内容,而是存储指向文件内容快照的指针。

定位标的.git/HEAD

它就是一个文本文件,它永远指向你当前所在的位置。

引用地址簿.git/refs

.git/refs 目录就是 Git 仓库的“地址簿”,它以文件夹和文件的形式,存储了所有有名字的指针

    • ...

关系图

Git对象

最后更新于