• Git 存储目录结构介绍

首先我们先从 Git 存储目录说起,通过 git init 创建一个空的 Git 仓库,具体操作如下图:

创建完成后进入 .git 目录,如下图所示:

hooks 该目录用于配置 客户端执提交操作用于触发服务端的脚本配置,一般用于自动化部署使用

info 该目录用于配置一些不希望被 Git 管控的文件。

objects 该目录用于存储所有数据对象内容,这些数据内容类型有 commit tree blob tag

refs 该目录用于存储 Git 本地以及远程分支的引用,当然还有一种特殊的引用标签引用

config 该文件包含项目特有的配置选项,并且该配置仅对该 Git 仓库有效

description 该文件仅供 GitWeb 程序使用

HEAD 该文件表示当前 Git 仓库处于哪个分支

index 该文件保存暂存区信息 (空仓库下该文件不会显示一旦执行 git add 操作该文件就会出现)

通过 git config --local 查看 config 文件的变化

我们通过 git config --local 配置仅对于 gitLearn 项目有效,用户名和邮箱配置如下图所示:

查看 config 文件,会发现该文件新增用户信息配置。

Git 是如何存储的

Git 是一个内容寻址文件系统 其核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个 40 位字符串键,通过该 40 位字符串键可以在任意时刻再次检索(retrieve)该内容。

什么是内容寻址?

每次我们进行提交会通过 SHA-1 算法生成一个长度为 40 个字符的校验和(checksum hash)(也就是我们的 key)然后根据校验和去获取我们文件的内容。这种通过唯一标识的 key(也可以理解为内容的地址)去获取我们的内容的操作就是内容寻址。

15.4 Git 的对象

在 Git 中有四种对象分别为:

blob 是具体的文件对象

tree 是某个时刻提交目录的内容

commit 执行一次 commit 就会产生一个 commit 对象

tag 可以理解成 commit 的别名,一个 tag 对应一个 commit

了解 Git 的对象需要使用如下命令进行查看:

git cat-file -p 对象 hash 值 查看对象的内容

git cat-file -t 对象 hash值 查看对象的类型

git ls-files --stage 查看 index 文件内容

git hash-object 查看文件的 hash 值

查看 commit tree blob 三个对象演示

我们创建一个 first.txt 文件,并将其提交到暂存区中。

进入 .git 文件夹下会发现新增了一个 index 文件。

我们可以通过 git ls-files --stage 查看 index 文件的内容。

进入 objects 目录发现 9c 文件夹名称+文件名称 和 index 文件中的一段字符串内容相同。

我们通过 git cat-file -t 9c59e24b8393179a5d712de4f990178df5734d99 我查看该表示对象类型 如下图所示表示该标识对象类型是 blob。

执行 git commit -m 将 first.txt 文件提交到本地仓库中。

执行 git log 查看我们的提交记录。

如下图所示我们通过 git cat-file -p commitId 查看我们提交的内容。如下图所示:我们最新一次提交包含了一个 59b06 开头的 tree 对象。

在 ./git/objects 目录中可以找到我们对应的文件。

我们通过 git cat-file -p tree对象哈希值,查看该 tree 对象的内容 。如下图所示显示就是我们 git add参生的 blob对象。

在通过 git cat-file -p blob对象哈希值,查看我们 blob对象内容,如下图所示 blob对象 内容就是我们 first.txt 文件的内容。

我们将 first.txt 文件提交到本地仓库 会产生一个 commit 一个 tree 和一个 blob 对象。

tag 对象原理演示

首先我们通过 git log 查看最新的提交是 add a.txt 注释的 commit 如下图所示。

通过 git tag -a v1.1 -m ‘add a.txt tag’ 为该 commit 创建一个附注标签。

在我们的 .git/refs/tags/ 目录下会新增 v1.1 文件。

v1.1 内容如下:

看到这个你肯定想到了这是一个 Git 对象,我们通过 git cat-file -t 查看这个哈希值对象类型。如下图所示它是一个 tag。

然后通过 git cat-file -p 查看它的内容,如下图所示,该tag包含了commit 对象和 标注的信息。

你真的懂git 吗的更多相关文章

  1. 你真的懂git rebase吗?

    前段时间由于某种原因,开始接手开发公司前端Vue搭建的项目 该前端项目采用的是基于git rebase的形式去合并代码,而我之前使用git一直都是采用merge的形式合并分支代码,对于rebase一概 ...

  2. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  3. 【转】was mutated while being enumerated 你是不是以为你真的懂For...in... ??

    原文网址:http://www.jianshu.com/p/ad80d9443a92 支持原创,如需转载, 请注明出处你是不是以为你真的懂For...in... ??哈哈哈哈, 我也碰到了这个报错 . ...

  4. javascript的语法作用域你真的懂了吗

    原文:javascript的语法作用域你真的懂了吗 有段时间没有更新了,思绪一下子有点转不过来.正应了一句古话“一天不读书,无人看得出:一周不读书,开始会爆粗:一月不读书,智商输给猪.”.再加上周五晚 ...

  5. 你真的懂ajax吗?

    前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...

  6. “三次握手,四次挥手”你真的懂吗?TCP

    “三次握手,四次挥手”你真的懂吗?  mp.weixin.qq.com 来源:码农桃花源 解读:“拼多多”被薅的问题出在哪儿?损失将如何买单? 之前有推过一篇不错的干货<TCP之三次握手四次挥手 ...

  7. 你真的懂 ajax 吗?

    前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...

  8. 【转】先说IEnumerable,我们每天用的foreach你真的懂它吗?

    [转]先说IEnumerable,我们每天用的foreach你真的懂它吗? 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq ...

  9. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

随机推荐

  1. CMPP服务端源码

    CMPP服务端,带数据库,可以接收第三方CMPP客户端的短信,并存入数据库,结合我的cmpp客户端服务程序,将可以实现接收第三方SP的短信并转发到网关实现发送,并将状态报告.上行短信转发给第三方SP, ...

  2. Typora使用手册

    块状元素: 标题: # 标题1 ## 标题2 ### 标题3 #### 标题4 ##### 标题5 ###### 标题6 使用快捷键: Ctrl + 1-6 块引用 使用符号 > 就可以进入引用 ...

  3. English--虚拟语气和条件状语从句

    English|虚拟语气和条件状语从句 虚拟语气在英语中,还是有一定地位的,毕竟大家都做着我有一百万的梦~~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任 ...

  4. ES6的新特性

    ECMAScript 6(简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,又称ECMAScript 2015.ES6就是ES2015. 虽然目前并不是所有 ...

  5. 什么是MVC框架?

    1.什么是mvc Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里,在改进和个性化 ...

  6. jQuery绑定事件的四种方式:bind、live、delegate、on

    1.jQuery操作DOM元素的绑定事件的四种方式 jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undele ...

  7. 汽配生产的精益化管理如何实现?这家3000人的企业靠MES系统进行管理

    精益达电子事业部电子车间于在完成车间改造后,生产能力得到大幅提升.但生产制造过程信息化仍处于空白,众多设备处于单机工作模式,车间现场计划排产.物料管理.质量管理等,还处于原始的凭经验.人工干预方式. ...

  8. FFMPEG处理音频时间戳的主要逻辑

    来源:http://www.xuebuyuan.com/1466771.html FFMPEG处理音频时间戳的主要逻辑 2013年12月09日 ⁄ 综合 ⁄ 共 2226字 ⁄ 字号 小 中 大 ⁄ ...

  9. windows+jenkins+springboot自动构建并后台执行jar

    本文只讲述如何在windows环境下,搭建jenkins并使用,至于概念的东西请自行百度. 好了,直入主题,本人使用 jenkins.war 包进行部署,我们需要准备如下几个: openjdk8    ...

  10. 【还是畅通工程 HDU - 1233】【Kruskal模板题】

    Kruskal算法讲解 该部分内容全部摘录自刘汝佳的<算法竞赛入门经典> Kruskal算法的第一步是给所有边按照从小到大的顺序排列. 这一步可以直接使用库函数 qsort或者sort. ...