1、git仓库的初始化:

输入git init指令,会看到在当前空目录下创建了一个.git隐藏文件夹,这个就是git实现一切版本管理的关键。
进入到.git目录下,里面包含三个文件(config/description/HEAD)和四个文件夹(hooks/info/objects/resf)

官方对各个文件和文件夹有详细的介绍:
- config:记录与本项目相关的配置信息
- descripton:是GitWeb项目对于本仓库的基本描述
- HEAD:内部记录了当前分支的最后一次提交(默认指向refs/heads/master文件)
- hooks:记录客户端和服务端的脚本,完成相关的自动化工作(钩子脚本的目的)
- info:记录全局的文件忽略方式,用于标记不被git仓库跟踪的文件,与.gitignore类似
- objects:这是git仓库的关键,归档所有git数据库里的内容
- refs:这个也是git仓库主要内容,记录所有分支的提交对象(commit object)

2、git存储第一阶段:缓冲区(index or staged)

初始化完成后,我们开始正常工作,创建一个测试文件test.txt,输入一行字符串。此时使用git status查看一下状态:

从上图可以看出test.txt文件还没进入到git仓库内部,处于untracked状态,.git文件夹与初始化时刻相同(使用find . -type f指令的运行结果可以看出),并未发生任何变化,所以git status之所以能够将untracked文件标记出来,是通过排除的方式,即.git仓库中没有记录的同级目录下的所有文件。

下面我们将新增的测试文件test.txt添加到缓冲区中,输入指令:

$git add test.txt

此刻再次运行git status和find . -type两条指令,得到的结果如下截图:

由此我们可以看出,git add指令执行成功后,test.txt文件已经被标记为staged状态(截图中的绿色标记)。此时可以看到在.git/objects目录下多出了一个文件12/268d69。这与上文介绍的objects目录的作用一致,用于存储所有git仓库数据库的内容,以文件的形式存储(因为git是一款基于内容检索的文件系统)。

这里我们可以使用官方给出的工具git cat-file查看一下多出来的这个文件存储的内容是啥?输入如下指令:

#cat指令本身在linux下就是显示文件内容的工具,谁让git的作者与linux是同一个大神呢
#-p是print的意思,用于直接将内容打印到stdout
$git cat-file -p 12268d69

结果如下:

这正是我们缓冲区test.txt文件的内容。

由此我们可以对git如何管理和归档文件有一个宏观的认识,说到底就是:
一个基于内容检索的文件系统,Content-Basd Filesystem。我们常见的文件系统(NTFS、FAT、FAT32)是基于地址的方式来检索,即先给定具体的地址(32位或64位)然后从地址编号所对应的存储单元内部取出文件内容,而Content-Based Filesystem恰恰相反,是通过对文件整个内容进行运算,得到的结果才是一个真实的存储位置,类似于哈希映射,为了叙述方便,这里就简单的理解为哈希映射吧。

3、git存储第二阶段:提交(commit)

运行命令:

$git commit -m "add test.txt"

使用git status和find . -type f两条指令来看一下git仓库和当前目录的状态:

由上图可以看出,git commit成功后在git add基础上objects文件夹内又多出了两个文件,91/07cb7e和e3/3b9905(从文件的归档路径和命名方式可以看出git使用了SHA-1算法对文件内容进行了校验——即基于文件内容的哈希映射系统),使用git cat-file -t命令查看一下这两个文件的类型:

由此看出多出的两个文件,一个是commit对象,一个是tree对象。
再使用git cat-file -p命令查看这两个文件的内容:

它们的关系是这样的:
91/07cb7e是一个commit对象,它的tree属性指向了tree对象e3/3b9905,它记录了文件操作,作者,提交者等信息
e3/3b9905是一个tree对象,它的blob属性指向了blob对象12/268d69,它记录了文件名
12/268d69是一个blob对象,它记录了文件内容

git底层原理(一)的更多相关文章

  1. git底层原理(二)

    git对象模型 在git系统中有四种类型的对象,所有的Git操作都是基于这四种类型的对象:"blob":这种对象用来保存文件的内容."tree":可以理解成一个 ...

  2. git的核心命令使用和底层原理解析

    文章目录: GIT体系概述 GIT 核心命令使用 GIT 底层原理 一.GIT体系概述 GIT 与 svn 主要区别: 存储方式不一样 使用方式不一样 管理模式不一样 1.存储方式区别 GIT把内容按 ...

  3. Git详解之九:Git内部原理

    Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的, ...

  4. Git的原理简介和常用命令

    Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等.顾名思义,版本控制系统主要就是控制.协调 ...

  5. git内部原理

    Git 内部原理 无论是从之前的章节直接跳到本章,还是读完了其余章节一直到这——你都将在本章见识到 Git 的内部工作原理 和实现方式. 我们发现学习这部分内容对于理解 Git 的用途和强大至关重要. ...

  6. Git详解之九 Git内部原理

    以下内容转载自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各 ...

  7. Git 内部原理 - (7)维护与数据恢复 (8) 环境变量 (9)总结

    维护与数据恢复 有的时候,你需要对仓库进行清理 - 使它的结构变得更紧凑,或是对导入的仓库进行清理,或是恢复丢失的内容. 这个小节将会介绍这些情况中的一部分. 维护 Git 会不定时地自动运行一个叫做 ...

  8. Git 内部原理--初探 .git

    说到Git大家应该都非常熟悉,几乎每天都会用到它.在日常使用过程中,我们貌似并不需要关注其内部的原理,只需要记住那几个常用的命令,就可以说自己是会Git的人了.可是,事实真的是这样子的吗?今天我们就来 ...

  9. Git内部原理浅析

    Git独特之处 Git是一个分布式版本控制系统,首先分布式意味着Git不仅仅在服务端有远程仓库,同时会在本地也保留一个完整的本地仓库(.git/文件夹),这种分布式让Git拥有下面几个特点: 1.直接 ...

随机推荐

  1. python select epoll poll的解析

    select.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组(在linux中一切事物皆文件 ...

  2. BS结构中,web如何将数据进行DES加密并写道IC卡中

    在IC卡应用系统中,一般都要对IC卡数据进行DES加密,以保证数据的安全.友我科技RFID读写器云服务2.0充分考虑了这个需求,只需要软件工程师简单的配置即可实现数据的加解密并且写到数据块中.如下图所 ...

  3. 计算机程序的思维逻辑 (79) - 方便的CompletionService

    上节,我们提到,在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java并发包提供了一个方便的方法,使用Comple ...

  4. Webdriver API之操作(二)

    一.窗口截图 dirver.get_screenshot_as_file("D:\\report\\image\\xxx.jpg") 二.关闭窗口 dirver.close() # ...

  5. 学习css之文本属性

    css3之文本属性: 1.缩进和水平对齐:text-indent, 通过使用 text-indent 属性,所有元素的第一行都可以缩进一个给定的长度,甚至该长度可以是负值. 这个属性最常见的用途是将段 ...

  6. Elasticsearch搜索之explain评分分析

    Lucene的IndexSearcher提供一个explain方法,能够解释Document的Score是怎么得来的,具体每一部分的得分都可以详细地打印出来.这里用一个中文实例来纯手工验算一遍Luce ...

  7. PHP的laravel框架后台实现数据导出excel的功能

    要想在PHP后台实现excel导入导出功能,一种简单有效的方法就是使用phpexcel插件. 要使用phpexcel插件,首先需要下载composer,这个工具是专门用来管理项目中库之间的依赖关系的. ...

  8. 记一些让footer始终位于网页底部的方法

    上次说把网页的头部和尾部分离出来作为一个单独的文件,所有网页共用,这样比较方便修改,然而,,,我发现某些方法里尾部会紧跟在头部后面,把内容挤在下面..而且有的页面内容少的话不能把尾部挤到最下面,所以, ...

  9. bzoj1898 [Zjoi2005]沼泽鳄鱼

    Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几 ...

  10. __read_mostly变量含义

     1. 定义 __read_mostly原语将定义的变量为存放在.data.read_mostly段中,原型在include/asm/cache.h 中定义: #define __read_mos ...