📜  Git – 对象模型(1)

📅  最后修改于: 2023-12-03 15:30:56.801000             🧑  作者: Mango

Git - 对象模型

在介绍 Git 对象模型之前,先来解释一下 Git 的三种状态:

  1. Modified:文件被修改了,但是还没有被提交到 Git 中。

  2. Staged:文件修改已经添加到 Git 中了,但是还没有提交。

  3. Committed:文件修改已经被提交到 Git 中了。

接下来我们来看 Git 的对象模型,Git对象模型由四个主要的对象组成:

  1. Blob:Blob 是 Git 对待文件内容的方式,它只是存储文件的内容,可以是文本也可以是二进制数据。文件内容相同,Blob 对象也会相同。
$ echo 'Hello World' | git hash-object --stdin
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

上面的命令生成一个 Blob(b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9),包含了“hello world”信息。

  1. Tree:Tree 对象代表了一次提交中的目录结构。它包含了一些 Blob 对象,它层级结构与文件系统类似。
$ git write-tree
c23570b8c12a06707d48e1f084cfe7678ddc74a7

上面的命令生成了一个 Tree(c23570b8c12a06707d48e1f084cfe7678ddc74a7)。这个 Tree 包含一些文件和子目录。

  1. Commit:Commit 包含了一次提交的所有信息,如提交人、时间和消息,还包含了这次提交的 Tree 对象和上一次提交所形成的 Commit 对象的引用。
$ echo 'First commit' | git commit-tree c23570b8c12a06707d48e1f084cfe7678ddc74a7
f166b752bf7b13e76cbd593da1431b1910860f6d

上面的命令生成了一个 Commit(f166b752bf7b13e76cbd593da1431b1910860f6d),包含有一条提交信息以及一个 Tree 对象的引用。

  1. Tag:Tag 用于标记特定的 Commit。它包含一个 Commit 对象的引用,以及一个被称为 tag name 的字符串。
$ git tag -a v1.0 f166b752bf7b13e76cbd593da1431b1910860f6d -m "My first tag"

上面的命令创建了一个名为 v1.0 的 Tag,和一个关联的 Commit 对象。

总结:

Git 对象模型通过这四种对象进行了描述,它们的关系决定了 Git 的文件版本控制。每次的修改操作都会生成新的对象,并链接至当前的提交记录。这一机制使得 Git 保留了完整的版本历史,并保证了数据的完整性。