深入理解Git - Git底层对象
如何从稍微底层一点的角度,从底层实现理解一切皆commit ?
配合希沃白板课件食用,效果更佳:
【希沃白板5】课件分享 : 《Git 进阶 - 从使用角度深入理解Git》
https://r302.cc/ke8XdO?platform=enpc&channel=copylink
点击链接直接预览课件
git 文件系统
git 本质上是一个基于键值对的文件系统。
文件系统,最重要的两个内容,当然就是 文件 和 文件夹 了。

blob object(数据对象)
git 中的 blob object 就是文件系统中的文件,包含 键:一个 hash 值和校验值的组合,值:文件内容。

比较特殊的是:blob object 只存内容,不存文件名,文件名在 tree object 中保存。
tree object (树对象)
相当于文件系统中的文件夹。

commit object(提交对象)

提交对象可以理解为对树对象的一层封装,里面包含了提交时间,提交作者等信息,更重要的,里面包含了父提交的ID,由此就可以形成 git 提交的有向无环图。
git 的这些对象的数据,保存在 .git/objects 目录下。

这里,我们并没有发现分支这些概念,回顾之前说的『一切皆 commit』的理解,分支这些,不过是某个 commit 的引用。(都是纸老虎)

案例
将 t/bugfix 分支重置到 a1b2c3 提交。
可以使用熟悉的 reset 命令: (@t/bugfix)git reset --hard a1b2c3,也可以用更底层的命令:git update-ref refs/head/t/bugfix a1b2c3。
效果是一样的,当然,平时使用,只推荐前者,这里只是作为对“分支是某个commit的引用”这句话理解的一个案例。
标签对象
tag object(标签对象)

标签对象:指向一个特定对象的固定引用对象;
可以给 git 中的任意对象打标签;
标签对象不是引用(与分支名不同),是一种独立的git对象。但在使用上(针对提交的tag),体验一致。所以“一切皆commit”这句话,对标签而言,是不一定正确的,但实际使用中,一般只会给提交打标签。
所有的引用,都记录在 .git\refs 文件夹中。
压缩与增量存储
在没有压缩时,称 git 的存储模式为松散的对象模式,即一个文件的不同版本,都是保存其全部的数据。在 git gc 时,会压缩并实现增量存储。这个命令在执行 pull 等命令时自动触发。

为什么 git 彻底删除大文件要修改整个历史?
因为提交的不可变性,如图,如果 newfile 是个大文件,即使删除,在提交历史中依然存在。要彻底删除,就要重写 second 提交以及之后的每一个提交,因为之后的提交都有 tree 指向这个大文件,即使删除,提交的父提交也需要变化。
如
- 彻底清除 newfile 之后,second 提交将无效,需要生成一个新提交,second' ;
- three 提交的 tree 引用中,也需要删除 new.cs 的引用,同时修改父提交为 second' ,生成新提交为 three' ;
- 对于 forth 提交,不用清理 tree 对象,但也需要将父提交修改为 three',得到新的提交 forth' ;
- 以此类推,后面的每一个提交都需要修改;
勘误:这里的 three,应该是 third 。图片中也写错了,就懒得改了。

原文连接:https://www.cnblogs.com/jasongrass/p/10582465.html
END
深入理解Git - Git底层对象的更多相关文章
- [转]深入理解学习GIT工作流
深入理解学习Git工作流 字数13437 阅读2761 评论3 喜欢70 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心 ...
- 深入理解学习Git工作流(转)
个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎st ...
- 深入理解学习Git工作流(git-workflow-tutorial)
转载:https://segmentfault.com/a/1190000002918123#articleHeader11 人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协 ...
- [git] git 的基本认知
版本管理 ( Version Control ) 版本管理系统是一个记录文件变更的系统,让你在一段时间后可以恢复指定版本的文件.版本管理系统大致可分为三类:独立的本地版本管理系统.中心化版本管理系统. ...
- [git] git怎样fork一个repo
描述 我定制了一下strongswan的工程.然后想把我自己的定制变成一个repo push到远端git.tong.com与大家分享. 这个时候,应该怎么做? 如果你用过github的话.那么你可以理 ...
- error setting certificate verify locations: CAfile: E:/git/Git/mingw64/ssl/certs/ca-bundle.crt
一.问题: 当git clone项目时报 error setting certificate verify locations: CAfile: E:/git/Git/mingw64/ssl/cert ...
- [git]git 分支
什么动作,关键看你想完成什么 1. 添加新的远程分支: git push origin current_local_branch:new_remote_branch 2. 删除远程分支(冒号前必须要有 ...
- 正确理解DTO、值对象和POCO
今天推荐的文章比较技术化也比较简单,但是对于一些初学者而言,可能也是容易搞混的概念:就是如何理解DTO.值对象和POCO之间的区别. 所谓DTO就是数据传输对象(Data Transfer Objec ...
- Git -> Can't start Git: git.exe
问题描述 导入别人的PyCharm项目后提示:Can't start Git:git.exe 解决办法 Git就是个类似插件,在Git的官网上注册个账号然后每次编译就会自动把程序上传到网上备份.可以方 ...
随机推荐
- Java并发编程原理与实战三十:CountDownLatch与CyclicBarrier 区别
相信每个想深入了解多线程开发的Java开发者都会遇到CountDownLatch和CyclicBarrier,大家也在网上看到各种介绍原理,代码的,以及他们区别(应付面试)的,但是很少能讲清楚:他们到 ...
- 牛市必备的三个条件,A股现在还差几个
1.国家政策 2.中美贸易 3.资金支持 A股变化如神! 自本月10日受美股大跌的影响后,A股先是随之震荡跳水,千股跌停:随后因高层力挺和政策支持而V型反转,集体涨停:接着上演过山车走势,有时涨得令人 ...
- soj1767.传纸条
这道题目想了一会儿觉得不知道如何下手,上网看了下资料,原来这道是一道非常经典的题目. 设 f [ k ][ i ][ j ] 表示第 k 步,第 1 条路径走到第 i 行,第 2 条路径走到第 j 行 ...
- 超酷JQuery动画分页按钮,鼠标悬停滑动展开
1.效果及功能说明 animate动画分页按钮制作鼠标悬停分页按钮上滑动展开分页按钮,鼠标离开后分页按钮收缩 2.实现原理 主要是靠动画方法,来让原本的箭头图像的长度发生变长,正好可以融入下标题的文字 ...
- 谁说码农不懂浪漫?js写的'老婆生日快乐'特效
一直被老婆抱怨不懂浪漫,老婆的生日又来了,老婆指着闺蜜空间上贴的老公做的胡萝卜心形浪漫晚餐告诉我:必须送她一份用心的礼物.我绞尽脑汁想出这么一法子,还是得用我们码农的独特方式,经过一天多的努力,终于做 ...
- 2016-2017-2 《Java程序设计》第五周学习总结
20155223 2006-2007-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 try.catch语法:若程序发生错误,执行流程就调离错误点,然后比较catch括号 ...
- 【解析】解析XML
一.dom4j import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelp ...
- [转]使用 C++11 编写 Linux 多线程程序
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...
- 2016.6.26——Maximum Depth of Binary Tree
Maximum Depth of Binary Tree 本题收获 1.树时使用递归 2.注意边界条件时输出的值,仔细阅读题意,若是面试时,问清边界条件. 题目: Given a binary tre ...
- lucene总结——(十七)
(01)rownum和rowid有何区别? rownum在表结构中是看不见的,只能在select中明确写出rownum方可显示 rownum与不同的表绑定在一起,每张表都有自已的r ...