目录
面试阐述 Git 的两大内容:
基础的 Linux 命令:
Git 对象(管理单个文件的版本)
树对象:管理整个项目版本
提交对象
区域:工作区、暂存区、版本库
先在工作区修改数据,然后存到暂存区,暂存区的数据到一定的量时,存到版本库中
对象:
git 对象:单个文件,.git/objects 保存了所有的历史记录
树对象:版本的快照
提交对象:版本快照的封装
clear | 清除屏幕 |
echo '内容' | 控制台输出内容 |
echo '内容’ > 文件名.后缀名 | 在根文件夹下创建该文件,文件中包含内容 |
ll | 控制台输出当前目录下的子文件和子目录 |
find 目录名 | 找到目录,并在控制台输出目录下的子孙文件和子孙目录 |
find 目录名 -type f | 将对应目录下的文件输出在控制台 |
rm 文件名 | 删除文件 |
mv 源文件 重命名文件 | 重命名 |
cat 文件的url | 查看对应文件的内容 |
vim 文件的url(英文模式下) | 按 i 进入插入模式 进行文件的编辑 按 esc 或 : 进行命令的执行 q! 强制退出 wq 保存退出 set nu 设置行号 |
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 文件路径 返回文件的键值
向数据库写入内容方式一:
在图下的路径中生成该文件,键值唯一
向数据库写入内容方式二:
查看文件出现乱码,因为文件已经经过压缩
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 + 第二个树对象在暂存区的内容
// 第一次创建提交对象
echo 'first commit' | git commit-tree 树对象的hash
// 第二次创建提交对象
echo 'second commit' | git commit-tree 树对象的hash -p 前一个提交对象的hash
// 查看提交对象
git cat-file -p 提交对象的hash