Git 内部原理:对象与哈希

Git 之之所以快速且可靠,归功于其数据存储方式。要精通 Git,你必须了解 .git 目录。这个隐藏文件夹包含了 Git 追踪项目所需的一切。

Git 使用四种主要的对象类型来管理你的工作:

  • Blobs:存储文件内容。
  • Trees:存储目录结构和文件名。
  • Commits:存储项目的快照和元数据。
  • Tags:存储对特定版本的引用。

Git 使用哈希(hashing)来标识一切。它使用 SHA-1 算法将数据转换为唯一的 ID。这个 ID 就像指纹一样。如果你修改了文件中的一个字符,哈希值就会完全改变。

Git 如何构建快照:

当你提交(commit)一个文件时,Git 会创建一系列对象链。

  1. Blob 存储文件中的实际文本或数据。
  2. Tree 将该 blob 映射到特定的文件名和文件夹路径。
  3. Commit 将 tree 与作者、时间戳和提交信息关联起来。

Git 不存储变更或“增量(deltas)”。它存储的是快照。每次你提交时,Git 都会创建新对象。这使得你的历史记录是不可变的,并且易于恢复。

理解这种结构有助于你修复错误、恢复丢失的数据以及管理复杂的分支。

尝试这个小项目来实际体验一下:

  1. 初始化仓库: mkdir git-lab cd git-lab git init

  2. 创建一个文件并查找其哈希值: echo 'Hello Git' > hello.txt git hash-object hello.txt

  3. 将文件作为 blob 存储: git hash-object -w hello.txt

  4. 检查对象类型和内容: git cat-file -t [YOUR_HASH] git cat-file -p [YOUR_HASH]

  5. 创建一个提交并查看 tree: git add hello.txt git commit -m 'Initial commit' git ls-tree HEAD

深入了解其底层原理,你会发现 Git 不仅仅是一个版本控制工具。它是一个高度组织化的、基于内容寻址的对象数据库。

来源: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc

可选的学习社区: https://t.me/GyaanSetuAi