2. Git 底层概念(底层命令)

目录

 

面试阐述 Git 的两大内容:

基础的 Linux 命令:

Git 对象(管理单个文件的版本)

树对象:管理整个项目版本

提交对象


面试阐述 Git 的两大内容:

区域:工作区、暂存区、版本库

  先在工作区修改数据,然后存到暂存区,暂存区的数据到一定的量时,存到版本库中

对象:

 git 对象:单个文件,.git/objects  保存了所有的历史记录

 树对象:版本的快照

 提交对象:版本快照的封装

基础的 Linux 命令:

clear 清除屏幕
echo '内容' 控制台输出内容
echo '内容’ > 文件名.后缀名 在根文件夹下创建该文件,文件中包含内容 
ll 控制台输出当前目录下的子文件和子目录
find 目录名 找到目录,并在控制台输出目录下的子孙文件和子孙目录
find 目录名 -type f

将对应目录下的文件输出在控制台

rm 文件名 删除文件
mv 源文件 重命名文件 重命名
cat 文件的url 查看对应文件的内容
vim 文件的url(英文模式下)

按 i 进入插入模式     进行文件的编辑

按 esc 或 :                 进行命令的执行 

            q!        强制退出

            wq       保存退出

            set nu  设置行号 

 

 

 

 

 

 

 

 

 

 

 

 

 

Git 对象(管理单个文件的版本)

  git 的核心部分是一个简单的键值对数据库。

  可以向数据库中插入任意类型的内容,它会返回一个键值,通过键值可以在任意时刻再次检索内    容

  key:val   组成的键值对(key 是 val 对应的hash)

                 键值对在git内部是一个blob类型

 向数据库写入内容  并返回对应键值,生成对应的 hash

echo 'test content' | git hash-object -w --stdin

     -w      选项指示 hash-object 命令存储数据对象;若不指定此选项,则命令仅返回对应的键值

     -stdin  (standard input)      选项则指示该命令从标准输入读取内容;

                                               若不指定,则要在命令尾部给出待存储文件的路径

                                                        将指定路径的文件交给 Git 管理

                  git hash-object -w 文件路径        存文件

                  git hash-object 文件路径             返回文件的键值

向数据库写入内容方式一:

2. Git 底层概念(底层命令)_第1张图片

在图下的路径中生成该文件,键值唯一

2. Git 底层概念(底层命令)_第2张图片

向数据库写入内容方式二:

2. Git 底层概念(底层命令)_第3张图片

查看文件出现乱码,因为文件已经经过压缩

cat ./.git/objects/bd/83801f897f05a09e1c286e20d4c50da0890952

git 代码行中 , ctrl+Ins 复制    shift+Ins 粘贴

win10中   选中即复制

代码行中直接右键复制粘贴

根据键值拉取数据

git cat-file -p hash名

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

       -t   查看类型    

 若改动添加到git管理的 源文件 ,Git中的文件并没有保存,需要重新进行写入内容

 文件名并没有保存,保存的是文件内容

  解决方案:树对象

注意:当前操作都是在对本地数据库进行操作   不涉及暂存区

树对象:管理整个项目版本

           能解决文件名保存的问题,允许多个文件组织到一起

Git 所有内容均以树对象数据对象(git对象)的形式存储,树对象对应了目录项

构建树对象

     利用 update-index 为 text.txt 的首个版本创建一个暂存区,并通过 write-tree生成树对象

文件模式
100644 普通文件
100755 可执行文件
120000 符号链接

 

 

 

 

 

// 1. 创建文件test.txt
echo 'test.txt v1' > test.txt

// 2. 向git数据库中写入 test.txt
git hash-object -w ./test.txt

      // 版本库中生成了hash文件

// 3. 查看暂存区
git ls-files -s 

// 4. 将test.txt 提交到暂存区       100644文件模式  
git update-index --add --cacheinfo 100644 生成的hash test.txt

      // 暂存区中生成了hash文件,版本库中没有

// 5. 生成树对象:将暂存区生成一个快照,作为树对象放到版本库中
git write-tree

   // 会在版本库中生成一个新的hash文件

   // 将暂存区中的数据存到版本库中,暂存区中的数据不会被清空


现在使用vim 修改 test.txt 的内容,生成第二个版本
需要再一次生成 git对象  存到暂存区  暂存区不会生成新的hash值,而是刷新数据
除了 test.txt, 还可以添加新的文件,依次 生成 git对象  存到暂存区
暂存区只会有一个 hash值

git write-tree   

将暂存区的内容,生成快照,然后作为树对象存储到版本库中

git read-tree

// 将第一个树对象加入第二个树对象,使其成为新的树对象
// git read-tree 将树信息读入索引,会在暂存区生成新的hash
git read-tree --prefix=bak 第一个树对象的hash

// 生成新的树对象
git write-tree


// 查看树对象
git cat-file -p 树对象的hash

最后生成的树对象v3 = 暂存区的第一个树对象v1 + 第二个树对象在暂存区的内容2. Git 底层概念(底层命令)_第4张图片

2. Git 底层概念(底层命令)_第5张图片

提交对象

// 第一次创建提交对象
echo 'first commit' | git commit-tree 树对象的hash

// 第二次创建提交对象
echo 'second commit' | git commit-tree 树对象的hash -p 前一个提交对象的hash

// 查看提交对象
git cat-file -p 提交对象的hash

 

2. Git 底层概念(底层命令)_第6张图片

2. Git 底层概念(底层命令)_第7张图片

 

你可能感兴趣的:(git,git)