03【彻底掌握Git的底层对象】

news2025/1/12 21:05:21

上一篇02【Git的基本使用-快速上手Git】


下一篇04【彻底掌握Git的底层对象】

目录【Git系列教程-目录大纲】


文章目录

  • 三、Git底层对象
    • 3.1 Blob对象
      • 3.1.1 Blob对象简介
      • 3.1.2 Blob对象的使用
        • 1)写入数据
        • 2)读取数据
        • 3)小练习
    • 3.2 Tree对象
      • 3.2.1 Tree对象简介
      • 3.2.2 暂存区的概念
      • 3.3.2 生成Tree对象
      • 3.2.3 Tree对象小练习
        • 1)生成第一个树对象
        • 2)生成第二个树对象
      • 3.2.4 读取树对象
    • 3.3 Commit对象
      • 3.3.1 Commit对象简介
      • 3.3.2 生成Commit对象
      • 3.3.3 指定父Commit对象提交

三、Git底层对象

Git 的核心部分是一个简单的键值对数据库。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容,我们之前使用add、commit、rm、mv等命令时其实就是在向Git这个数据库读取/添加数据。

需要注意的是,只要往Git中添加了数据,那么数据就永远不会被删除,使用git删除命令只是进行了一次新的版本的迭代。学习Git的底层命令有助于我们对Git的底层原理有一个更加清晰的认识;

在Git中存在三个元数据对象,分别为Blob对象(文本对象)、Tree对象(树对象)、Commit对象(提交对象),当我们在使用Git命令往Git中写数据时,Git会将其封装为这三种对象,三种不同的对象封装了不同的数据;其存储位置在.git/objects目录中;

3.1 Blob对象

3.1.1 Blob对象简介

Blob对象也称文本对象,当某个文本需要添加到Git中时,Git会将其包裹成一个Blob对象存储到Git数据库中,每个Blob对象都会有一个唯一的hash值,这就是Git中的最原始的版本信息。当修改文件后,需要再次将新的文件包裹成Blob对象存入Git数据库,这又是一次文件版本的更新

3.1.2 Blob对象的使用

1)写入数据
  • 语法:
git hash-object -w {文件名|目录名}

将数据写入Git:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui
$ git init								# 初始化git仓库
Initialized empty Git repository in C:/Users/Admin/Desktop/workspace/xiaohui/.git/

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui (master)
$ echo "111" >> aaa.txt					# 创建文件

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui (master)
$ git hash-object -w aaa.txt			# 将aaa.txt文件写入Git
warning: LF will be replaced by CRLF in aaa.txt.
The file will have its original line endings in your working directory
58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c

文件生成的路径默认在:.git\objects,其中生成的文件夹名称是hash值的前两位,其余的位数作为文件名

2)读取数据
  • 语法:
git cat-file {-p|-t} {hash}
  • -p:获取文件内容
  • -t:获取文件类型

从Git读取数据:

git cat-file -p 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c		# 获取Git对象的内容
git cat-file -t 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c		# 获取Git对象的类型

3)小练习

创建一个新的文件写入到Git中:

echo "Hello World" >> bbb.txt		# 创建一个新的文件
git hash-object -w bbb.txt			# 写入到Git中

查看objects目录:

读取文件内容:

git cat-file -p 557db03de997c86a4a028e1ebd3a1ceb225be238

修改文件内容,再次查看Git数据库中的数据:

echo "Hello Git" >> bbb.txt
git cat-file -p 557db03de997c86a4a028e1ebd3a1ceb225be238

重新将bbb.txt添加到Git数据库:

git hash-object -w bbb.txt		# 将bbb.txt重新添加到git数据库
find .git/objects/ -type f		# 查询objects目录下的所有文件

.git/objects/55/7db03de997c86a4a028e1ebd3a1ceb225be238				# bbb.txt  --->  HelloWorld
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c				# aaa.txt  --->  111
.git/objects/93/f515c1fffa123e2dc1ad3015fd59a421afacd2				# bbb.txt  --->  Hello World Hello Git

查询Git数据库,重新生成了一个Blob对象

  • 读取Blob对象:
git cat-file -p 557db03de997c86a4a028e1ebd3a1ceb225be238
git cat-file -p 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c
git cat-file -p 93f515c1fffa123e2dc1ad3015fd59a421afacd2

3.2 Tree对象

3.2.1 Tree对象简介

Blob对象中只会存储文本内容而不知道该文本的文件名称。同时,生成Blob对象代表是文件的一次版本,但是有时我们需要将多个操作归纳为一个版本。因此,在Git中,Blob对象只是代表文件的一个版本,而不是代表项目的一个版本,因为一次项目的版本可能涉及到多个文件的操作。

Tree对象也称树对象,一个树对象包含了一条或多条记录,一个Tree对象就是一次操作的版本,Tree对象中保存有该对象所涉及到的所有文件(包括文件名称)。在Git中,一个Tree对象才能称得上是一次真正意义上的版本(快照)

另外,一个Tree对象还可以包含另一个Tree对象。

3.2.2 暂存区的概念

一个Tree对象是由一条或多条记录组成的,那么如何让Tree对象包含多个记录呢?

我们在生成Tree对象之前,需要将所有的记录都存储到"暂存区",暂存区用于"暂存"一些操作,等这些操作足够成为一次版本时就将暂存区中的内容生成一个Tree对象,这样Tree对象就包含了多个记录了。

  • 将记录添加到暂存区:
git update-index --add --cacheinfo {文件模式} {hash} {文件|目录}

文件模式:

  • 100644:普通文件
  • 100755:可执行文件
  • 120000:符号链接

  • 查看暂存区:
git ls-files -s

3.3.2 生成Tree对象

【语法】

git write-tree			# 将当前暂存区的内容生成Tree对象

【练习】

  • 1)初始化git仓库:
rm -rf ./* .git
git init
  • 2)生成第一个Blob对象:
Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ echo "111" >> aaa.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git hash-object -w aaa.txt
warning: LF will be replaced by CRLF in aaa.txt.
The file will have its original line endings in your working directory
58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -t 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c
blob

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c
111

2)生成第二个Blob对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ echo "222" >> bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git hash-object -w bbb.txt
warning: LF will be replaced by CRLF in bbb.txt.
The file will have its original line endings in your working directory
c200906efd24ec5e783bee7f23b5d7c941b0c12c

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -t c200906efd24ec5e783bee7f23b5d7c941b0c12c
blob

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p c200906efd24ec5e783bee7f23b5d7c941b0c12c
222

3)将两个记录添加到暂存区:

git update-index --add --cacheinfo 100644 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c aaa.txt
git update-index --add --cacheinfo 100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c bbb.txt

4)查看暂存区:

git ls-files -s

5)将两次操作生成Tree对象(一次版本)

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 将暂存区的内容生成Tree对象
$ git write-tree		
32dcf33783f09530a55367ae95a221b9ee1c1eba

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 查看objects目录中的文件
$ find .git/objects/ -type f
.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 查看该hash对应的git类型
$ git cat-file -t 32dcf33783f09530a55367ae95a221b9ee1c1eba
tree

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 查看该hash的内容
$ git cat-file -p 32dcf33783f09530a55367ae95a221b9ee1c1eba
100644 blob 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c    aaa.txt
100644 blob c200906efd24ec5e783bee7f23b5d7c941b0c12c    bbb.txt

6)查看暂存区:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git ls-files -s
100644 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c 0       aaa.txt
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bbb.txt

一个Tree对象中包含多个变更的Blob对象,Blob对象对应我们实际开发中的一个个操作,当一个个操作满足了一次版本的要求时,我们就会生成对应的Tree对象来生成版本。因此,我们在实际使用Git时,一个Tree对象往往才是代表一个项目的某个版本,而非Blob对象;

3.2.3 Tree对象小练习

1)生成第一个树对象
  • 1)初始化Git仓库:
Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace
$ git init
Initialized empty Git repository in C:/Users/Admin/Desktop/workspace/.git/

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ echo "111" >> aaa.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git hash-object -w aaa.txt											# 生成Blob对象
warning: LF will be replaced by CRLF in aaa.txt.
The file will have its original line endings in your working directory
58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ echo "222" >> bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git hash-object -w bbb.txt											# 生成Blob对象
warning: LF will be replaced by CRLF in bbb.txt.
The file will have its original line endings in your working directory
c200906efd24ec5e783bee7f23b5d7c941b0c12c

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 添加到暂存区
$ git update-index --add --cacheinfo 100644 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c aaa.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 添加到暂存区
$ git update-index --add --cacheinfo 100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git ls-files -s														# 查看暂存区的内容
100644 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c 0       aaa.txt
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git write-tree														# 生成Tree对象
32dcf33783f09530a55367ae95a221b9ee1c1eba

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba			# 树对象(包含aaa.txt和bbb.txt)
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c			# aaa.txt
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c			# bbb.txt

查看树对象的内容:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p 32dcf33783f09530a55367ae95a221b9ee1c1eba
100644 blob 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c    aaa.txt
100644 blob c200906efd24ec5e783bee7f23b5d7c941b0c12c    bbb.txt

2)生成第二个树对象

修改aaa.txt内容:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ echo "1010" >> aaa.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git hash-object -w aaa.txt									# 生成Blob对象
warning: LF will be replaced by CRLF in aaa.txt.
The file will have its original line endings in your working directory
7b481520925a2e75716034e3c858b7ef2a9aae75

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba			# 树对象(包含aaa.txt和bbb.txt)
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c			# aaa.txt(版本1)
.git/objects/7b/481520925a2e75716034e3c858b7ef2a9aae75			# aaa.txt(版本2)
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c			# bbb.txt(版本1)

将aaa.txt添加到暂存区:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git ls-files -s
100644 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c 0       aaa.txt
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git update-index --cacheinfo 100644 7b481520925a2e75716034e3c858b7ef2a9aae75 aaa.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git ls-files -s
100644 7b481520925a2e75716034e3c858b7ef2a9aae75 0       aaa.txt
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bbb.txt

Tips:aaa.txt文件已经添加了到了暂存区,第二次不需要再指定--add参数了;

将当前暂存区的内容生成Tree对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git write-tree
a24447346b4470013f38a67d14d97f975e39c037		# 本次树对象的hash值

查看所有Git对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba			# 树对象v1(包含aaa.v1和bbb)
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c			# aaa.txt(版本1)		
.git/objects/7b/481520925a2e75716034e3c858b7ef2a9aae75			# aaa.txt(版本2)
.git/objects/a2/4447346b4470013f38a67d14d97f975e39c037			# 树对象v2(包含aaa.v2和bbb)
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c			# bbb.txt(版本1)

查看第2个树对象的内容:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p 32dcf33783f09530a55367ae95a221b9ee1c1eba
100644 blob 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c    aaa.txt			# v1版本
100644 blob c200906efd24ec5e783bee7f23b5d7c941b0c12c    bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p a24447346b4470013f38a67d14d97f975e39c037
100644 blob 7b481520925a2e75716034e3c858b7ef2a9aae75    aaa.txt			# v2版本
100644 blob c200906efd24ec5e783bee7f23b5d7c941b0c12c    bbb.txt

3.2.4 读取树对象

【语法】

git read-tree --prefix=bak {Tree-hash}		# 根据Tree对象的hash来读取树,将读取到的内容写入暂存区

【练习】

读取树对象v2的内容到暂存区:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git read-tree --prefix=bak a24447346b4470013f38a67d14d97f975e39c037		# 读取版本2的树对象(包含aaa.v2和bbb)到暂存区

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git ls-files -s
100644 7b481520925a2e75716034e3c858b7ef2a9aae75 0       aaa.txt				# aaa.v2(原来暂存区就有的内容)
100644 7b481520925a2e75716034e3c858b7ef2a9aae75 0       bak/aaa.txt			# 树对象.v2中的aaa
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bak/bbb.txt			# 树对象.v2中的bbb
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bbb.txt				# bbb.v1(原来暂存区就有的内容)

将暂存区中的内容生成Tree对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git write-tree
bdf7b58c9bfca7f494b2575ffed44cde91f80ce5

查看所有Git对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba			# 树对象v1(包含aaa.v1和bbb)
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c			# aaa.txt(版本1)		
.git/objects/7b/481520925a2e75716034e3c858b7ef2a9aae75			# aaa.txt(版本2)
.git/objects/a2/4447346b4470013f38a67d14d97f975e39c037			# 树对象v2(包含aaa.v2和bbb)
.git/objects/bd/f7b58c9bfca7f494b2575ffed44cde91f80ce5			# 树对象v3(树对象v2和树对象v1)
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c			# bbb.txt(版本1)

查看三个树对象的内容:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p 32dcf33783f09530a55367ae95a221b9ee1c1eba
100644 blob 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c    aaa.txt			# v1版本
100644 blob c200906efd24ec5e783bee7f23b5d7c941b0c12c    bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p a24447346b4470013f38a67d14d97f975e39c037
100644 blob 7b481520925a2e75716034e3c858b7ef2a9aae75    aaa.txt			# v2版本
100644 blob c200906efd24ec5e783bee7f23b5d7c941b0c12c    bbb.txt

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p bdf7b58c9bfca7f494b2575ffed44cde91f80ce5
100644 blob 7b481520925a2e75716034e3c858b7ef2a9aae75    aaa.txt			# v2版本
040000 tree a24447346b4470013f38a67d14d97f975e39c037    bak				# 树对象v2版本
100644 blob c200906efd24ec5e783bee7f23b5d7c941b0c12c    bbb.txt

此时树对象(v3)包含一个树对象(v2)和两个Blob对象;

3.3 Commit对象

3.3.1 Commit对象简介

Tree对象代表了项目中的一次版本快照,但是Tree对象缺失了一些日志信息,例如本次版本快照是谁(哪个开发人员)产生的?本次的版本快照的主要内容(日志信息)是什么?等等。

Commit对象也称提交对象,Commit对象是对Tree对象的包裹添加一些注释信息。值得注意的是:虽然Tree对象代表一次项目的版本快照,但是由于缺少注释信息,我们在生成Tree对象时还会将其打包为Commit对象,就这样,项目的一次完整版本快照就生成完毕了。

3.3.2 生成Commit对象

【语法】

echo '提交注释' | git commit-tree {tree-hash}		# 将指定的tree对象包裹为commit对象

查询所有Git对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba			# 树对象v1(包含aaa.v1和bbb)
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c			# aaa.txt(版本1)		
.git/objects/7b/481520925a2e75716034e3c858b7ef2a9aae75			# aaa.txt(版本2)
.git/objects/a2/4447346b4470013f38a67d14d97f975e39c037			# 树对象v2(包含aaa.v2和bbb)
.git/objects/bd/f7b58c9bfca7f494b2575ffed44cde91f80ce5			# 树对象v3(树对象v2和树对象v1)
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c			# bbb.txt(版本1)
  • 生成提交对象
Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		
$ echo "提交tree.v1" | git commit-tree 32dcf33783f09530a55367ae95a221b9ee1c1eba		# 生成提交对象
44811b2b63f5cbbc118012d7a8831479354f2c20

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		
$ git cat-file -t 44811b2b63f5cbbc118012d7a8831479354f2c20				# 查看Git类型的类型
commit

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p 44811b2b63f5cbbc118012d7a8831479354f2c20				# 查看提交对象的内容
tree 32dcf33783f09530a55367ae95a221b9ee1c1eba		# 该提交对象所包裹的树对象
author xiaohui <xiaohui@aliyun.com> 1696939487 +0800		# 作者信息
committer xiaohui <xiaohui@aliyun.com> 1696939487 +0800		

提交tree.v1			# 日志信息

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 查看暂存区(生成提交对象不会对暂存区有影响)
$ git ls-files -s
100644 7b481520925a2e75716034e3c858b7ef2a9aae75 0       aaa.txt
100644 7b481520925a2e75716034e3c858b7ef2a9aae75 0       bak/aaa.txt
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bak/bbb.txt
100644 c200906efd24ec5e783bee7f23b5d7c941b0c12c 0       bbb.txt

Tips:生成Blob对象和Tree对象时,只要操作一致多次生成的Blob对象和Tree对象的编号是一样的,但是Commit对象的编号即使多次操作一致,编号也会不一样

查看所有Git对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f

.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba			# 树对象v1(包含aaa.v1和bbb)
.git/objects/44/811b2b63f5cbbc118012d7a8831479354f2c20			# 提交对象
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c			# aaa.txt(版本1)		
.git/objects/7b/481520925a2e75716034e3c858b7ef2a9aae75			# aaa.txt(版本2)
.git/objects/a2/4447346b4470013f38a67d14d97f975e39c037			# 树对象v2(包含aaa.v2和bbb)
.git/objects/bd/f7b58c9bfca7f494b2575ffed44cde91f80ce5			# 树对象v3(树对象v2和树对象v1)
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c			# bbb.txt(版本1)

3.3.3 指定父Commit对象提交

在生成Commit对象对象时,我们可以设置该Commit对象的父Commit对象,代表本次的Commit对象是基于上一次Commit的版本更新;这样就形成了一个版本更新链路,我们根据这个链路就可以进行版本穿梭。

指定父对象生成提交对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ echo "提交tree.v2" | git commit-tree a24447346b4470013f38a67d14d97f975e39c037 -p 44811b2b63f5cbbc118012d7a8831479354f2c20
4d7779d1ef87bca1e988b76e4dd1cf9b7b47f858

查询提交对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -t 4d7779d1ef87bca1e988b76e4dd1cf9b7b47f858
commit

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git cat-file -p 4d7779d1ef87bca1e988b76e4dd1cf9b7b47f858		# 查看提交对象内容
tree a24447346b4470013f38a67d14d97f975e39c037
parent 44811b2b63f5cbbc118012d7a8831479354f2c20			# 父提交对象
author xiaohui <xiaohui@aliyun.com> 1696941179 +0800	# 作者信息
committer xiaohui <xiaohui@aliyun.com> 1696941179 +0800	
	
提交tree.v2		# 日志信息

查看所有的Git对象:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ find .git/objects/ -type f
.git/objects/32/dcf33783f09530a55367ae95a221b9ee1c1eba			# 树对象v1(包含aaa.v1和bbb)
.git/objects/44/811b2b63f5cbbc118012d7a8831479354f2c20			# 提交对象(树对象v1)
.git/objects/4d/7779d1ef87bca1e988b76e4dd1cf9b7b47f858			# 提交对象(树对象v2)
.git/objects/58/c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c			# aaa.txt(版本1)		
.git/objects/7b/481520925a2e75716034e3c858b7ef2a9aae75			# aaa.txt(版本2)
.git/objects/a2/4447346b4470013f38a67d14d97f975e39c037			# 树对象v2(包含aaa.v2和bbb)
.git/objects/bd/f7b58c9bfca7f494b2575ffed44cde91f80ce5			# 树对象v3(树对象v2和树对象v1)
.git/objects/c2/00906efd24ec5e783bee7f23b5d7c941b0c12c			# bbb.txt(版本1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1099655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel大量表格选择,快速定位表格

excel有大量表格&#xff0c;快速定位表格方法。 在这个区域电机鼠标右键 出现表格选择。&#xff08;此处方便查看15个表格&#xff09;&#xff0c;如果超过15个表格可以选择其他工资表。 选择其他工作表会弹出列表框如下图 特此记录 anlog 2023年10月12日

红队专题-从零开始VC++远程控制软件RAT-C/S-[4]客户端与服务端连接

红队专题 招募六边形战士队员服务端编写新建工程server函数创建主线程类获取配置信息command 命令startsocket 开始监听win32 类库/头文件 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 服务端编写 新建工程 server函数 // FackExec_…

Windows10用Navicat 定时备份报错80070057

直接按照网上的教程配置定时任务发现报错&#xff0c;提示参数非法之类的&#xff0c;80070057。 搜索加自己测试发现是用户权限问题。 设置任务计划的时候&#xff0c;我用了用户组&#xff0c;选了administors&#xff0c;在勾选上run with hightest privileges。 查找用户…

JVM第七讲:JVM 基础 - Java 内存模型详解

JVM 基础 - Java 内存模型详解 本文是JVM第七讲&#xff0c;JVM 基础 - Java 内存模型详解。主要转载自 Info 上深入理解Java内存模型, 作者程晓明。这篇文章对JMM讲的很清楚了&#xff0c;大致分三部分&#xff1a;1、重排序与顺序一致性&#xff1b;2、三个同步原语&#xff…

数据结构复盘——第二章:线性表

文章目录 第一部分:顺序表1、顺序表的定义2、顺序表的操作3、顺序表的优缺点第一部分习题第二部分:单链表1、单链表的定义2、单链表的结点知识3、单链表的操作4、单链表的优缺点第二部分习题第三部分:双链表1、双链表的结构2、双链表的操作第三部分习题第四部分:静态链表1、…

使用 Tkinter Canvas 小部件添加放大镜功能?

一、说明 据我所知&#xff0c;内置的 Tkinter Canvas 类比例不会自动缩放图像。如果您无法使用自定义小部件&#xff0c;则可以缩放原始图像并在调用缩放函数时将其替换在画布上。 二、实现图像放大镜技术细节 我如何将放大和缩小添加到以下脚本中&#xff0c;我想将其绑定到…

OpenCV 笔记(1):图像的读取、显示、创建

Part11. 数字图像的含义 OpenCV 中的图像&#xff0c;其实指的是数字图像。在介绍图像这个概念之前&#xff0c;先介绍几个基础的概念&#xff1a; 像素(Pixel)是图像的基本单元或者基本元素&#xff0c;亦或者是图像最小的单位。图像中的像素点包含不同的像素值。对于灰白图像…

Flume 整合 Kafka

1.背景 先说一下&#xff0c;为什么要使用 Flume Kafka&#xff1f; 以实时流处理项目为例&#xff0c;由于采集的数据量可能存在峰值和峰谷&#xff0c;假设是一个电商项目&#xff0c;那么峰值通常出现在秒杀时&#xff0c;这时如果直接将 Flume 聚合后的数据输入到 Storm 等…

Vue-props配置功能

Vue-props配置功能 props概述 功能&#xff1a;接收从其他组件传过来的数据&#xff0c;将数据从静态转为动态注意&#xff1a; 同一层组件不能使用props&#xff0c;必须是父组件传子组件的形式。父组件传数据&#xff0c;子组件接收数据。不能什么数据都接收&#xff0c;可…

【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory

概念 关于微服务网关Gateway中有几十种过滤工厂&#xff0c;这一篇博文记录的是关于请求限流过滤工厂&#xff0c;也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理&#xff0c;如果不会被处理就会返回HTTP状态码为42…

三相异步电机动态数学模型及矢量控制仿真

三相异步电机动态数学模型及矢量控制仿真 本文带你一步步推倒三相异步电机动态数学模型&#xff0c;按基于转子磁链定向的矢量控制进行 matlab 仿真&#xff0c;实现较好的控制效果。 1、异步电机三相方程 2、坐标变换 3、磁链3/2变换推导 4、两相静止坐标系下的方程 5、…

python 图片下面加边框TK界面

python 对图片增加边框&#xff0c;logo贴图&#xff0c;获取图片exif参数&#xff0c;填写图片文本内容-CSDN博客 import tkinter as tk from tkinter import ttk import os import glob import json import tkinter.messagebox as messagebox # 弹出提示框 from PIL import…

Vue 如何检测 data 中 数组的变化?

Vue 可以使用 watch 和 computed 监听数组的变化。 ① 使用 watch 监听数组 可以通过 deep 选项深度监听数组内部元素的变化 ② 使用 computed 监听数组 创建一个计算属性&#xff0c;返回数组的长度或者某个数组元素的值&#xff0c;当数组发生变化时&#xff0c;计算属性会…

在nodejs中实现调度任务

在nodejs中实现调度任务 node.js帮助开发人员简化了工作流程&#xff0c;创建了高效的应用程序。它的许多有用功能之一是任务调度。本文将探讨在nodejs中调度任务的重要性、各种使用第三方库的代码示例&#xff0c;以及需要遵循的一些有用的操作。 为什么我们需要安排任务 调…

#创作纪念日#我的256天创作纪念日

我的创作256天纪念日 机缘收获日常成就憧憬 机缘 机缘……好像128天的时候已经写过了…… 小升初时&#xff0c;我开始接触编程&#xff0c;进入了一个全新的世界。刚开始学习编程时&#xff0c;我只是对电脑的一些操作比较感兴趣&#xff0c;但慢慢地&#xff0c;我开始对编…

模式植物GO背景基因集制作

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 写在前面 关于GO背景基因集文件的制作&#xff0c;我们在很早以前也发过。近两天&#xff0c;自己在分析时候&#xff0c;也是被搞了头疼。想重新制作一份GO背景基因集&#xff0c;进行富集分析。但是结果&…

vueday01——ref响应式

特性&#xff1a;持续监控某个响应式变量的属性名变化&#xff0c;可以使用shallowRef来取消这一特性&#xff0c;只监控对象整体的变化 ref测试代码&#xff1a; <template><div :id"idValue" ref"myDiv">打印obj{{ obj }}</div><…

大数据Flink(九十七):EXPLAIN、USE和SHOW 子句

文章目录 EXPLAIN、USE和SHOW 子句 一、EXPLAIN 子句 二、USE 子句

QQd挂源码已更新最新加速项目程序全开源

1、99 公益日活动加速任务已全部完成适配&#xff0c;空间公益说说和评论并分享小世界内容任务在已有的功能上进行挂机&#xff0c; 其中【发小世界】功能暂时更名为【公益小世界】。 2、上线新功能【公益答题】用于完成参加 Qbox 公益答题任务&#xff0c;等级套装有任意一项…

期中考Web复现

第一题 1z_php <?php //Yeedo told you to study hard! echo !(!(!(!(include "flag.php")||(!error_reporting(0))||!isset($_GET[OoO])||!isset($_GET[0o0])||($_GET[OoO]2023)||!(intval($_GET[OoO][0])2023)||$_GET[0o0]$_GET[OoO]||!(md5($_GET[0o0])md5($_…