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”,会发生什么情况呢?
-
- 给现有的 strong.txt blob 对象添加 “double lemon”
-
- 创建与现有的 strong.txt blob 对象的差异作为新的 blob 对象
- 创建全新的 blob 对象
“附加问题”
如果在”strong.txt”文件中添加了”double lemon”并进行了第3次提交,会发生什么?
-
- “double lemon” 被添加到现有的 strong.txt 的 blob 对象中
- 新的 blob 对象作为现有的 strong.txt 的 blob 对象与之间的差异创建