前言

洞悉技术的本质,可以让我们在层出不穷的框架面前仍能泰然处之。用了那么久的 Git,不懂点内部原理,那可不行!懂点原理可以让我们遇到问题的时候能够更好更快的理清解决问题的思路。

要真正读懂本文可能需要以下基础:

  • 有 Git 使用经验
  • 对 Git 的三个分区有所了解
  • 熟悉常用的 Linux 命令
  • 对经典哈希算法有一定的了解,比如SHA-1、SHA-256、MD5等

在开始之前,让我们先抛出几个问题,然后一一解决、回答它们

  • .git版本库里的文件/目录是干什么的?
  • Git是如何存储文件信息的?
  • 当我们执行git add、git commit时,Git背后做了什么?
  • Git分支的本质是什么?

Git分区

在真正开始之前,让我们先回顾下Git的三个分区(Workspace、Index / Stage、git repository)

  • 工作区(Workspace):此处进行代码文件的编辑
  • 索引或称暂存区(Index / Stage):存储文件状态信息,进行commit前会对此时的文件状态作快照(Snapshot)
  • Git版本库(git repository):由Git Object持久记录每一次commit的快照和链式结构的commit变更历史

先看下从《Got Git》和网络上搬来的Git分区工作原理图和待remote的工作流再次感性回顾下之前使用Git自己时怎么操作的

git版本库里的文件/目录是干什么的

让我们通过一个从GitHub clone下来的一个实际项目的版本库来看下这些文件/目录,clone下来的repository

$ git clone https://github.com/yeshan333/Explore-Git$ ls -F1
config
description
HEAD
hooks/
index
info/
logs/
objects/
packed-refs
refs/

挑几个重要文件/目录的做下解释

  • HEAD文件:用于存放当前所在分支的引用,这个引用是个符号引用(symbolic reference)
  • index文件:二进制文件,它就是暂存区(Stage Area)。它是一个目录树,记录了文件的时间戳、文件长度、SHA-1等
  • refs目录:基本所有的引用(references)文件都存放在这里,引用文件中的内容为SHA-1值,一般是commit
    object的SHA-1值
  • objects目录:用于存放数据的所有 Git Object均存放在这个目录下,每个 Git Object

抱着一些初步的认知,我们继续解决后面几个问题,加深对.git版本库内文件的理解

Git是如何存储文件信息的

要知道Git如何存储信息,我们需要了解一下常见的Git对象,Git就是通过这些对象存储文件信息的。Git Object是Git存储文件信息的最小单元,如下为几种常见的Git Object以及它们的作用,它们一般是不可变的(immutable),这些对象使用40位的SHA-1值进行标识。

  • blob:用于存储文件内容,Git保存文件的时候不会保存文件名
  • tree object:当前目录结构的一个快照(Snapshot),它存储了一条或多条树记录(tree
    entries),每条记录含有一个指向数据对象(blob)或子树对象(子树木对象可理解为子目录)的SHA-1指针以及相应的文件模式、类型、文件名,用于表示内容之间的目录层次关系
  • commit object:存储顶层tree object的SHA-1值、作者/提交者信息+时间戳以及提交注释,如果有父commit
    object,还会保存有这个commit object对应的SHA-1值。对于merge commit可能会有多个父commit
    object
  • tag object:用于标记commit object。关于tag object

让我们通过一个实际的版本库了解下这些对象,使用git log查看这个版本库详尽的历史提交记录

$ git log --pretty=raw
commit ee8a0dbc0c6fe89e6ff39b16c77543e8e2c6475b
tree fb12b3e52ce18ce281bfc2b11a5e4350c2d10358
parent 7b94dcbe89c9534913854284b4af727a9a5dfc84
author yeshan333 <1329441308@qq.com> 1580629391 +0800
committer yeshan333 <1329441308@qq.com> 1580629391 +0800final commitcommit 7b94dcbe89c9534913854284b4af727a9a5dfc84
tree 8feb4afbab18e8d386413224a9e74f871c15a5ca
author yeshan333 <1329441308@qq.com> 1580629170 +0800
committer GitHub <noreply@github.com> 1580629170 +0800Initial commit

Git提供了一把非常好用的瑞士军刀

探索git背后的秘密相关推荐

  1. CC讲坛-大脑疾病背后的秘密-许执恒

    <CC讲坛>第二十期于2017年7月27日在北京东方梅地亚中心M剧场举行,中国科学院遗传与发育生物学研究所研究员许执恒出席并进行题为<大脑疾病背后的秘密>的演讲. 胚胎时期大脑 ...

  2. 浅析2017年双十一数据,为你揭秘这些巨额成交量背后的秘密。

    2017年双十一过去已经一周之余,不知道大家是不是都已经收到了自己的战利品~今天就为大家分析揭秘双十一的巨额数据背后的秘密,顺便也可感受一下国人对于购物的热情. 首先说一个众所周知的数据:2017年双 ...

  3. 揭秘爱奇艺qsv文件背后的秘密

    揭秘爱奇艺qsv文件背后的秘密 想做影视二次剪辑的朋友,想获取爱奇艺的高清资源吗?想知道如何将qsv文件导入剪映吗?本文带大家揭秘爱奇艺qsv文件背后的秘密,文章最后提供了绿色免费的转换工具可以将qs ...

  4. 端侧 AI SDK 框架,快手爆款特效落地背后的秘密

    7 月 5 日,快手 Y-tech 部门 AI 工程团队的崇洋铭在 GMTC 全球大前端技术大会(北京站)2021,做了题为<端侧 AI SDK 框架,爆款特效批量生产背后的秘密>的演讲. ...

  5. 初学JAVA项目(五、取名背后的秘密)

    初学JAVA项目(五.取名背后的秘密) Java 新生儿取名背后的数据可视化 前言 一.取名背后的秘密 二.关于一些问题的学习 1.Java中如何进行函数式编程? 1.1 什么是函数式编程? 1.2 ...

  6. 云计算背后的秘密(6)-NoSQL数据库的综述

    我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoSQL有了非常深入的研究,但是在最近准备YunTable的Chart的时候,发现NoSQL不仅非常博大精深,而且我个人对NoSQL的理解也只 ...

  7. 云计算背后的秘密(1)-MapReduce

    之前在IT168上已经写了一些关于云计算误区的文章,虽然这些文章并不是非常技术,但是也非常希望它们能帮助大家理解云计算这一新浪潮,而在最近几天,IT168的唐蓉同学联系了我,希望我能将云计算背后的一些 ...

  8. if快还是switch快?解密switch背后的秘密

    这是我的第 57 篇原创文章 条件判断语句是程序的重要组成部分,也是系统业务逻辑的控制手段.重要程度和使用频率更是首屈一指,那我们要如何选择 if 还是 switch 呢?他们的性能差别有多大?swi ...

  9. 正则语言和正则表达式_探索正则表达式背后的语言学

    正则语言和正则表达式 by Alaina Kafkes 由Alaina Kafkes 探索正则表达式背后的语言学 (Exploring the Linguistics Behind Regular E ...

最新文章

  1. 快速排序时间复杂度为O(n×log(n))的证明
  2. 2012秋江苏省计算机二级上机试题,江苏省高校计算机等级考试二级2012秋资料.doc...
  3. Kubernetes-dashboard安装
  4. docker run 原理
  5. 计算机考研只有数据结构,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  6. python背诵技巧_15条常用Python小技巧
  7. Windows10下安装QT5.14.2并用VS2019打开
  8. 检查异常和非检查异常 有空你去学一下检查异常和非检查异常
  9. python中序列类型和数组之间的区别_「Python」序列构成的数组
  10. codeforces George and Job
  11. web项目接到请求之后执行sql特别慢_小米开源!SQL优化工具,人工智能帮你 Rewrite...
  12. Ansi,UTF8,Unicode,ASCII编码的差别
  13. 进程间通信的11种方法
  14. JavaScript 函数参数默认值
  15. 如果你要补充益生菌 ——益生菌补充、个体化、定植指南
  16. CSDN如何收藏别人的博客文章
  17. 服务器BMC管理工具ipmitool的安装和使用
  18. laravel 验证手机号
  19. 无线网可拼服务器吗6,当WiFi 6遇到了WiFi 6+,我们的网速真的变快了吗?
  20. 机器学习的几种分类损失函数

热门文章

  1. MySQL下载与安装教程(超详细)
  2. ༺ཌ༈常见浏览器介绍༈ད༻
  3. excel一列求和_Excel超实用小技巧:快速求和和对齐,一秒搞定
  4. RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道
  5. 基于 MFC+Halcon 实现图像缩放、平移
  6. 西华师范大学计算机网络原理,王朝斌 - 西华师范大学 - 计算机学院
  7. vb数字转汉字大写值
  8. [转贴]因父之名:一个“非科班”的成长史
  9. CAD绘图控件VectorDraw web library (javascript) v7.7010.1.0发布丨附下载
  10. Lambda表达式创建线程