【Git】第三部分 git底层概念

导读:本篇文章讲解 【Git】第三部分 git底层概念,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

【Git】第三部分 git底层概念



3. git底层概念

3.1 基本的linux命令

clear :清除屏幕

echo 'xxx':往控制台输出信息

echo 'xxx' > test.txt :可以创建文件

ll :将当前目录下的 子文件&子目录平铺在控制台

find 目录名: 将对应目录下的子孙文件&子孙目录平铺在控制台

find 目录名 -type f :将对应目录下的文件平铺在控制台

rm 文件名 : 删除文件

mv 源文件 重命名文件: 重命名

cat 文件😗* 查看对应文件的内容

vim 文件

​ 按 i插入模式

​ 进行文件的编辑ESC

​ 按:键 进行命令的执行

q! : 强制退出(不保存)

wq :保存退出

set nu: 设置行号

3.2 .git目录

命令:在此项目所在的目录执行:git init

  作用:初始化后,在当前目录下会出现一个名为 .git目录(下图所示),所有 Git 需要的数据资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。

在这里插入图片描述

hook –> 包含客户端服务端钩子脚本

info –> 包含一个全局性的排除文件

logs –> 保存日志信息

objects –> 目录存储所有的数据内容

refs–> 目录存储指向数据的提交对象的指针(分支)

config–> 文件包含项特有的配置选项

description –> 用来显示对仓库的描述信息

HEAD –> 文件指示目前被检出的分支

index –> 文件保存的暂存信息

3.3 git对象

Git 的核心部分是一个简单的键值对数据库。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容。

在这里插入图片描述

  1. 向数据库中写入内容,并且返回对应的键值

    echo 'test1' | git hash-object -w --stdin

    -w:命令存储数据对象,如果不指定该命令只会返回对应的键值,并不会将数据存入到数据库(objects)中

    --stdin :表示该命令从标准输入读取内容,如果不指定该命令,需要在命令的末尾给出待存储的文件的路径

  2. 向数据库中存文件

    git hash-object -w 文件路径

  3. 读取对应文件的键值

    git hash-object 文件路径

    返回的是一个长度为40个字符的hash值

  4. 查看 Git 是如何存储数据的

    find .git/objects -type f

    Git 存储内容的方式:一个文件对应一条内容,hash值的前2个字符用于目录的命名,后38个字符用于文件命名

  5. 查看键值的数据(内容)

    git cat-file -p hash值

    -p :选项可指示该命令自动判断内容的类型,并为我们显示格式友好的内容

    返回:对应文件的内容

  6. 对文件进行简单的版本控制

    创建一个新文件并将其内容存入数据库命令:

    echo 'version 1' > test.txt

    git hash-object -w test.txt

    返回:

    83baae61804e65cc73a7201a7252750c76066a30

    向文件里写入新内容,并再次将其存入数据库命令:

    echo 'version 2' > test.txt

    git hash-object -w test.txt

    查看数据库内容命令:

    find .git/objects -type f

    git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30

    git cat-file -p 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a

    利用cat-file -t命令,可以让 Git 告诉我们其内部存储的任何对象的类型

    git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a

    返回的是blob类型

    问题:

    1.记住文件的每一个版本所对应的 hash值并不现实

    2.在 Git 中,文件名并没有被保存——我们仅保存了文件的内容

    3.解决方案:树对象

    4.当前的操作都是在对本地数据库进行操作不涉及暂存区

3.4 树对象

  1. 我们先创建一个文件echo 'verson1' >version-first.txt,此时还没交给git管理

  2. 把文件交给git去管理git hash-object -w ./version-first.txt,生成git对象,返回的hash值作为键,对应的文件内容作为值git对象只能代表文件版本不能代表项目版本。

  3. 为首个版本创建一个暂存区git update-index --add --cacheinfo 100644 04aa2ea7a69769f4357ee9908073d10cd5e29557 version-first.txt

    说明

    • 100644:表示这是一个普通文件
    • 100755:表示一个可执行文件
    • 120000:表示一个符号链接
    • --add:表示因为此前该文件并不在暂存区中 首次需要—add
    • --cacheinfo:因为将要添加的文件位于 Git 数据库中,而不是位于当前目录下,所有需要cacheinfo
    • git ls-files -s 查看暂存区
  4. 生成树对象git write-tree,树对象就是暂存区的快照,代表一个项目的版本

  5. 查看树对象git cat-file -p cb3b308810c51a0474ddb428d114bf20944b5334

3.5 提交对象

我们可以通过调用 git commit-tree hash值命令创建一个提交对象,为此需要指定一个树对象的 hash值,以及该提交的父提交对象的hash值(如果第一次将暂存区做快照就没有父对象

1.创建提交对象

echo 'first-commit' | git commit-tree xxx

​ 返回:一个新的hash值

echo 'second-commit' | git commit-tree 要添加的tree的hash值 | 父对象tree的hash值

​ 返回:一个新的hash值

2.查看提交对象

git cat-file -p xxx

3.注意

git commit-tree 不但生成提交对象,而且会将**对应的快照(树对象)**提交到本地库中


总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82916.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!