Git – 对象模型
当我们使用 git 时,我们用来将存储库初始化为 git 存储库的第一个命令是git init 命令。使用该命令后,我们可以看到.git文件夹已创建。让我们深入了解该文件夹,看看我们在 .git 文件夹中有什么。
我们可以看到.git文件夹中有很多子目录,但我们要查看的子目录是.git/objects子目录。通常,objects 文件夹包含四种不同类型的对象——blob、tree、commit 和 tag 。
.git/objects目录现在是空的,但是我们会看到它的一些变化,我们会理解为什么这个目录对我们很重要。在 Git 中,每个提交、每个树和每个文件都作为哈希值保存在 objects 文件夹中。每个对象都有一个唯一的哈希值,可以帮助 Git 找到它所在的位置。相应地创建文件夹。随着我们前进,我们将了解哈希。由于objects文件夹现在是空的,让我们创建一个文件demo.txt并在里面写“Hello Geeks” 。
We are using Ubuntu here but Windows users can work with the git bash . Ubuntu Commands can be run on git bash.
现在,让我们将更改添加到暂存区域并使用以下命令提交更改:
git add demo.txt
git commit -m “First Commit”
让我们观察这个命令之后对象文件夹中的变化。
所以我们得到了命名为 2 个字符长和 38 个字符长的文件名的新目录。
Note: You might have different hashes in your computers so no need to worry if you don’t get the same hashes.
Git 为每个对象生成一个 40 个字符的校验和 (SHA-1) 哈希,该校验和的前两个字符用作目录名,其他 38 个字符用作文件名。
Therefore the 40 character hashes that we have are –
6d510f79378ca9954e1078a70ff4fdaaa64494fe
7c5d8f39237365acdf66527189ba4fbb6c59b4fc
893f819f4a3b12c76aec907ad636edff48ffcfad
现在让我们检查这 3 个不同的对象及其类型。我们将使用命令——git cat-file
但是,我们需要的命令是——
- git cat-file -t
// 用于显示对象的类型 - git cat-file -p
// 用于显示对象的内容
让我们检查一下类型 我们的对象——
git cat-file -t <40 character hash value> //checks the type of the object
因此,我们得到的类型是——blob、tree 和 commit。让我们更详细地了解它们。
1. 斑点对象
Blob – Binary Large Object
Blob 存储文件的内容。每当我们提交文件时,创建的第一类对象就是 blob 对象。让我们看看我们的 blob 对象的内容——
git cat-file -p
我们可以看到我们得到了我们最初编写的文件 demo.txt 的内容,即Hello Geeks。
2. 树对象
树对象包含我们存储库中所有文件的列表,并带有指向分配给它们的 blob 对象的指针。让我们在下面的帮助下看看我们的树对象的内容——
git cat-file -p
Tree 对象中的每一行都有 -文件权限、对象类型、对象哈希和文件名。让我们打破界限 -
文件权限(100 644 ) - 644 的权限意味着文件的所有者具有读写权限,而系统上的其他用户只有读取权限。 blob 表示对象的类型。 40个字符的hash代表对象的hash。您可以使用您的 blob 哈希对其进行验证。 demo.txt 代表文件名。
3. 提交对象
Git 创建一个提交对象,该对象具有指向其树对象的指针。提交对象包含 -树对象哈希、父提交哈希、作者、提交者、日期和消息。让我们看看我们的提交对象的内容——
git log
git cat-file -p
从上图中可以清楚地看出,提交对象由 -树对象、作者姓名、提交者姓名和提交消息组成。由于我们已经涵盖了 3 种不同类型的对象,因此我们只剩下一种,即标记对象。
4. 标记对象
标签对象包含对象名称、对象类型、标签名称、创建标签的人的姓名和消息。让我们使用 –
git tag -a “first-tag” -m “Tag For First Commit”
现在让我们检查我们的对象文件夹,看看是否创建了标签对象。
我们可以看到正在添加一个新目录“97”。现在让我们验证我们的类型并查看标签对象的内容。
git cat-file -t
git cat-file -p
我们可以看到标签对象正像我们预期的那样指向提交对象(使用我们的提交哈希值进行验证)。我希望你会发现这篇文章很有用。我们已经涵盖了所有四种对象类型,您可以通过进行一些更改并再次重复上述步骤来尝试更多。