Git 存储版本学习

Git存储


我们都知道Git把所有修订版本和历史信息存放在工作目录根目录下一个名为.git的隐藏子目录中。实际上在这个对目录下的对象库(.git/objects)被组织及实现成一个内容寻址的存储系统。具体而言,Git会根据对象的内容应用SHA1得到的散列值作为全局的唯一标识(Git追踪的是内容而不是文件)。

  • 那它具体是如何维护管理这些信息的
  • 一个文件修改后是全量记录还是增量

基础对象类型

对象说明
块 (blob)文件的每一个版本表示为一个块(blob)。blob是“二进制大对象“(binary large object)的缩写。
目录树(tree)一个目录树代表一志目录信息。
提交(commit)保存版本库中每一次变化的元数据,包括作者、提交者、提交日期和日志消息。
标签(tag)一个标签对象分配一个任意的且人类可读的名字给一个特定对象,通常是一个提交对象

示例

blob示例
mkdir blob && cd blob && git init //创建初使化

//添加文件前后git仓库的变化
find .git
find .git/objects/ -type f
echo 'hello world' > file1 //创建一个文件
git add file1 //添加到git
find .git
find .git/objects/ -type f
git ls-files -s //可以查看索引信息

//添加相同内容仓库的变化
(验证Git追踪的是内容而不是文件,不包含文件的元数据,如:名字、路径、格式)
echo 'hello world' > file2 && git add file2 
find .git/objects/ -type f

//相关命令
git show 或 git cat-file -p 散列值 //查看对应的内容
git hash-object 文件内容 //查看对应的散列
tree示例
git write-tree //接着上面的例子把索引保存成树对象,多次对相的索引执行该命令结果一样并不需要重新计算。
git cat-file -p //因为它是和blob一样的对象有唯一的散列,可以用这个方法查看,查到的结果和上面查看索引时一样。

mkdir subdir && cp file* subdir
git add . && git ls-files -s //查看我们新添加的目录文件
git write-tree | xargs git cat-file -p //生成树对象,并查看这个树对象的内容,会发现跟之前的散列完全一样的内容
find .git/objects/ -type f //对象存储目录里这时有三个对象(它们都是?)


commit示例
git commit-tree -m 'first commit' 散列值 //平时git commit可以跳过git write-tree 和 git commit-tree
git cat-file -p 散列值 

说明(提交对象包含)

  • 关联文件的树对象的名称;
  • 作者的名字和时间;
  • 提交者的名字和时间(一般和作者是同一个人);
  • 提交时的说明信息
tag示例
git tag -m 'The v 1.0.0' v1.0.0 //生成tag对象,tag对象分轻量级和带标注的,很多Git命令只对带标注的起作用
git rev-parse v1.0.0 //查找tag对应散列, 也可以跟散列值前缀查找完整散列
git cat-file -p 散列值 //查看tag对象信息

// 一个文件修改后是全量记录还是增量 ?
mkdir test && cd test && git init
echo 'hello world' > file
git add file
find .git/objects/ -type f
git ls-files -s
echo 'xxx' > file
git add file
find .git/objects/ -type f  //查看对象库增加了一个新的文件
git ls-files -s //索引也变了
git cat-file -p 散列值 

##思考讨论

Git这样对文件内容全量快照的形式会有什么问题产生

  • 删除大文件
  • 稀疏检出和浅克隆
  • 删除无用的分支、tag
  • 清理本地版本库
  • 克隆指定分支
    工作中有哪些场景可以适用借鉴Git存储的一些思想

相关资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值