3 内部对象如何实现git命令的执行

1 Git常用命令与文件状态流转

# 使用Git对项目进行版本控制,初始化
$ git init

# add命令,将项目文件放入暂存区
$ git add --all .

# commit命令,将暂存区文件提交至仓库区
$ git commit -m "项目代码的第一次提交"

----------------------------------------------------------------------------

# 查看commit的提交记录
$ git log
commit f95f59fd0c55bc8f8f81ff3919f8a97ccc97315c (HEAD -> master)
Author: GP6 <GP6@omlife.com.cn>
Date:   Mon Mar 23 18:00:47 2020 +0800

    项目代码的第一次提交

----------------------------------------------------------------------------

# 新增Test.java,修改GitTests.java,查看文件状态
$ git status
    src/main/java/com/gp6/git/Test.java
    modified:   src/test/java/com/gp6/git/GitTests.java


----------------------------------------------------------------------------

# 将文件放入暂存区
$ git add .

# 再次查看文件状态
$ git status
    new file:   src/main/java/com/gp6/git/Test.java
    modified:   src/test/java/com/gp6/git/GitTests.java

# 将文件提价至仓库中
$ git commit -m "第二次提交"
[master 9a459a0] 第二次提交
 2 files changed, 5 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/com/gp6/git/Test.java

----------------------------------------------------------------------------

# 查看提交记录
$ git log
commit 9a459a0707b5a6912ad2274bc2928bc20e1119a8 (HEAD -> master)
Author: GP6 <GP6@omlife.com.cn>
Date:   Wed Mar 25 11:55:25 2020 +0800

    第二次提交

commit 10ab94c5e545f4eecb09770fdaaff27f4b8105d4
Author: GP6 <GP6@omlife.com.cn>
Date:   Wed Mar 25 11:51:28 2020 +0800

    项目代码的第一次提交

2 解析命令

2.1 git init

  • 将项目初始化为本地仓库

  • 命令执行后,在项目目录下生成隐藏目录(.git)

  • .git目录下存在一个objects目录,objects目录中只有info和pack两个空文件夹

  • 初始化时不存在commit,所以不存在object


    image.png

2.2 git add

  • 工作目录下添加pom.xml

  • 使用git hash-object [文件名]查看文件hash-key

$ git hash-object pom.xml
e3521eb60ad395e4eccc6bcf2fcda12f05c77f70
  • 执行git add ./pom.xml,object目录自动新增一个e3目录,同时.git目录下的index文件大小也发生变更(将文件的信息保存到index文件中)

  • 由下图可看出,40位的hash-key 前两位作为目录名,后38位作为文件名,标识pom.xml这个object对象


    image.png
  • 使用hash-key可查看object对象的内容与类型

# 查看object对象内容
git cat-file -p [hash-key] 
    样例
    $ git cat-file -p e3521eb60ad395e4eccc6bcf2fcda12f05c77f70

# 查看object对象类型
git cat-file -t [hash-key]
    样例
    $ git cat-file -t e3521eb60ad395e4eccc6bcf2fcda12f05c77f70
    blob
  • 查看index内容
$ git ls-files --stage
100644 e3521eb60ad395e4eccc6bcf2fcda12f05c77f70 0       pom.xml

2.3 git commit

  • 新建src目录,目录下新增1.txt文件(文件内容随便填写)


    image.png
  • 将1.txt添加到暂存区,查看object目录与index文件的变化
# 查看src目录的hash-object值(可见,git未将目录视作object)
$ git hash-object ./src
fatal: Cannot open './src': Permission denied


# 查看1.txt的hash-object值
$ git hash-object ./src/1.txt
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

# 提交至暂存区
$ git add  ./src/1.txt

# 查看index文件变化
$ git ls-files --stage
100644 e3521eb60ad395e4eccc6bcf2fcda12f05c77f70 0       pom.xml
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       src/1.txt
  • object目录中新增e6目录(对应1.txt),src目录未在object目录中体现


    image.png
  • 执行第一次git commit,生成commit对象,同时生成tree对象(根据index记录生成)

  • 查看tree对象,master是分支名,master^{tree},表示master分支所指向的tree对象

$ git cat-file -p master^{tree}
100644 blob e3521eb60ad395e4eccc6bcf2fcda12f05c77f70    pom.xml
040000 tree 341e54913a3a43069f2927cc0f703e5a9f730df1    src

# 查看tree对象的内容
$ git cat-file -p 341e54913a3a43069f2927cc0f703e5a9f730df1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    1.txt

# 查看提交历史
$ git log
commit f818fc367672071759493276fb4811eb977d1b36 (HEAD -> master)
Author: GP6 <GP6@omlife.com.cn>
Date:   Wed Mar 25 14:43:47 2020 +0800

    第一次提交


# 查看提交详情
$ git cat-file -p f818fc367672071759493276fb4811eb977d1b36
tree e8a633e8dc116131317586e7a85e216c3c3248b8
author GP6 <GP6@omlife.com.cn> 1585118627 +0800
committer GP6 <GP6@omlife.com.cn> 1585118627 +0800

第一次提交

第一次提交object目录解析.png
第一次提交object指向解析.png
  • 对文件进行变更
$ git status
    modified:   src/1.txt
    .gitignore
    main/

$ git add .

$ git status
    new file:   .gitignore
    new file:   main/2.txt
    modified:   src/1.txt

$ git commit -m "第二次提交"

$ git ls-files --stage
100644 a2a3040aa86debfd8826d9c2b5c816314c17d9fe 0       .gitignore
100644 ad4b04bd10cace01ef2e80d79d04366884cc846e 0       main/2.txt
100644 e3521eb60ad395e4eccc6bcf2fcda12f05c77f70 0       pom.xml
100644 2f480d77203c7d56ccc820b6718fb4b48f3738a5 0       src/1.txt


$ git cat-file -p master^{tree}
100644 blob a2a3040aa86debfd8826d9c2b5c816314c17d9fe    .gitignore
040000 tree 33506635d883c7f7bca457f22300e4041dc80dae    main
100644 blob e3521eb60ad395e4eccc6bcf2fcda12f05c77f70    pom.xml
040000 tree 5d7ce3a823552f80c28a4860ce73a803d913c4b0    src


$ git log
commit 7e4ecdac4ee614e40a55d1a58529f087c3728440 (HEAD -> master)
Author: GP6 <GP6@omlife.com.cn>
Date:   Wed Mar 25 15:47:33 2020 +0800

    第二次提交

commit f818fc367672071759493276fb4811eb977d1b36
Author: GP6 <GP6@omlife.com.cn>
Date:   Wed Mar 25 14:43:47 2020 +0800

    第一次提交

GP6@GP6 MINGW64 /d/Study/Git/test (master)
$ git cat-file -p 7e4ecdac4ee614e40a55d1a58529f087c3728440
tree 652fa35b075c87becd7e995f9e03b3ca90f93f5f
parent f818fc367672071759493276fb4811eb977d1b36
author GP6 <GP6@omlife.com.cn> 1585122453 +0800
committer GP6 <GP6@omlife.com.cn> 1585122453 +0800

第二次提交

第二次提交object指向解析.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 主要内容介绍 1.设计思想 2.数据流向 3.git flow 4.其他介绍 5.思考讨论 6.参考资料 1.设计...
    不一样的卡梅利多阅读 1,129评论 0 13
  • Blob Object 10.1中说啦,git本质是一个内容可寻址的系统,所以Git的核心就是一个 key-val...
    老沈Rosen阅读 1,386评论 0 0
  • 你应该知道的git git 起步 git 基础 git 是分布式,也就是说没有中央服务器,代码从仓库完整的镜像下来...
    Lyan_2ab3阅读 466评论 0 3
  • Git 是一套内容寻址文件系统,那么Git是怎么进行寻址呢?其实,寻址无非就是查找,而Git采用HashTable...
    宇晨棒棒的阅读 324评论 0 0
  • 我初次面对死亡,还不足七岁。 爷爷蹚水,被淹死了。他浑身湿漉漉的,像一个提线木偶,被人摆布着穿上寿...
    清显君阅读 290评论 0 0