Git的机制 – Git对象(Git简明教程第二卷)

我稍微修改了在公司内部使用的东西
我认为这个主要是针对git初学者 (包括我自己) 的内容
如果您能在Qiita上以幻灯片模式查看,我将不胜感激


只要深入了解git的内部机制,使用git就会更加有趣!


这次我们不讨论Git的使用方法,而是关注它的机制。如果能了解这些,应对问题会更容易!


git对象

git是通过组合以下内容来表示存储库和分支等信息的。
这些信息存储在.git/objects中。

    • 1. blob

 

    • 2. tree

 

    • 3. commit

 

    4. tag

git 对象

这样的形象

    • 1. blob (ファイル)

 

    • 2. tree (ディレクトリ構造)

 

    • 3. commit (コミット情報)

 

    4. tag (タグ情報)

这次我们来看一下1-3!


我们现在就来看看.git/objects吧!


创建空的存储库时,不会创建任何对象。

$ mkdir explore-dot-git && cd explore-dot-git && git init
$ find .git/objects -type f
$

提交前不会进行任何创建操作。

$ echo "Alchol 9%" > strong.txt
$ find .git/objects -type f
$

当你执行git add时,会创建一个对象。

$ git add strong.txt
$ find .git/objects -type f
.git/objects/29/032df2fd6343ea93bc2c00cd5e93128ba1997f

blob对象

当使用`git cat-file`命令时,您可以检查对象。

查看对象类型的指令 -t (タイプ)

$ git cat-file -t 29032df2fd6343ea93bc2c00cd5e93128ba1997f
blob

查看文件内容(中身)

$ git cat-file -p 29032df2fd6343ea93bc2c00cd5e93128ba1997f
Alchol 9%

看起来 blob 对象存储了文件的内容!因此,blob 对象就像文件的内容。


我试试将其提交到git。

$ git commit -m 'add strong.txt'
[master (root-commit) 5fd34a2] add strong.txt
 1 file changed, 1 insertion(+)
 create mode 100644 strong.txt

物体增加了两个。

$ find .git/objects -type f
.git/objects/29/032df2fd6343ea93bc2c00cd5e93128ba1997f
.git/objects/48/b394fb164aeb3b5482f3123721df65e208d309
.git/objects/5f/d34a2411bf91577399fd6b9647e37d59e31fa8

让我们看看增加了两个物体!


提交的对象(第一个提交)

查看文件类型:cat-file -t (タイプ)

$ git cat-file -t 5fd34a2411bf91577399fd6b9647e37d59e31fa8
commit

请将 cat-file -p (中身) 改写为中文,仅提供一个选项 :

展示文件 (-p) 的内容 (中身)。

$ git cat-file -p 5fd34a2411bf91577399fd6b9647e37d59e31fa8
tree 48b394fb164aeb3b5482f3123721df65e208d309
author sunadorinekop <sunadorinekop@example.com> 1543332950 +0900
committer sunadorinekop <sunadorinekop@example.com> 1543332950 +0900

add strong.txt

提交对象看起来像是提交信息!


树 对象(第一个 提交)

查询文件类型的命令是 cat-file -t (タイプ)。

$ git cat-file -t 48b394fb164aeb3b5482f3123721df65e208d309
tree

显示(中身)

$ git cat-file -p 48b394fb164aeb3b5482f3123721df65e208d309
100644 blob 29032df2fd6343ea93bc2c00cd5e93128ba1997f    strong.txt

根据这个树对象,看起来是关于目录结构的信息呢!可以看出这个目录中有一个 strong.txt 文件,其哈希值为 29032d…!


迄今为止的印象

这样吗?

提交 > 树 > 块


那么,我再尝试提交一次。


进一步承诺

$ echo "Alchol 3%" > horoyoi.txt
$ git add horoyoi.txt
$ git commit -m 'add horoyoi'

物体增加了

$ find .git/objects -type f
.git/objects/29/032df2fd6343ea93bc2c00cd5e93128ba1997f
.git/objects/47/50679d8ca0d3379dae8abaed6b6013583de548
.git/objects/48/b394fb164aeb3b5482f3123721df65e208d309
.git/objects/5f/d34a2411bf91577399fd6b9647e37d59e31fa8
.git/objects/8b/9e22d4a872621a5ae50655f4ef45bbc6b3e6fc
.git/objects/a5/91a631eaff52e0f32df02d4ba80bc17dd044a1

让我们看看增加了的三个对象!


blob 对象(第2次提交)

查看文件类型 cat-file -t (タイプ)

$ git cat-file -t a591a631eaff52e0f32df02d4ba80bc17dd044a1
blob

猫文件 -p (center)

$ git cat-file -p a591a631eaff52e0f32df02d4ba80bc17dd044a1
Alchol 3%

因为这跟第一次提交的感觉一样,所以我认为没有问题。


提交对象(第二次提交)

查询文件类型的命令是”cat-file -t”。

$ git cat-file -t 8b9e22d4a872621a5ae50655f4ef45bbc6b3e6fc
commit

显示 (中身) 的文件内容。

$ git cat-file -p 8b9e22d4a872621a5ae50655f4ef45bbc6b3e6fc
tree 4750679d8ca0d3379dae8abaed6b6013583de548
parent 5fd34a2411bf91577399fd6b9647e37d59e31fa8
author sunadorinekop <sunadorinekop@example.com> 1543333980 +0900
committer sunadorinekop <sunadorinekop@example.com> 1543333980 +0900

add horoyoi

第一次提交的对象不同的是父对象5fd34a吗?

这表明这个第二次提交的对象的父对象是5fd34a…,也就是说,提交对象只知道它之前的一个提交对象。


提交对象的点。

Git通过Git对象指向前一个提交来表示提交的历史,例如第一个提交指向第二个提交,第二个提交指向第三个提交…

当这个坏了,就无法跟踪提交了,会被彻底破坏!(比如git push -f)


树形对象(第二次提交)

查看文件类型 cat-file -t (タイプ)

$ git cat-file -t 4750679d8ca0d3379dae8abaed6b6013583de548
tree

展示文件内容: cat-file -p (中身)

$ git cat-file -p 4750679d8ca0d3379dae8abaed6b6013583de548
100644 blob a591a631eaff52e0f32df02d4ba80bc17dd044a1    horoyoi.txt
100644 blob 29032df2fd6343ea93bc2c00cd5e93128ba1997f    strong.txt

刚才commit的horoyoi.txt增加了。
我们可以看到tree对象是该目录下文件等的列表信息。


以上

你能对blob、commit和tree有一些直观的理解吗?


请给我一个中文版本的给我们一个额外的问题。

如果在 strong.txt 文件中进行第三次提交时添加了 “double lemon”,会发生什么情况呢?

    1. 给现有的 strong.txt blob 对象添加 “double lemon”

 

    1. 创建与现有的 strong.txt blob 对象的差异作为新的 blob 对象

 

    创建全新的 blob 对象

“附加问题”

如果在”strong.txt”文件中添加了”double lemon”并进行了第3次提交,会发生什么?

    1. “double lemon” 被添加到现有的 strong.txt 的 blob 对象中

 

    新的 blob 对象作为现有的 strong.txt 的 blob 对象与之间的差异创建
广告
将在 10 秒后关闭
bannerAds