一、存储方式
如果让我们设计一个版本控制系统,最简单的方式就是每做一次更改就生成一个新的文件。
这样的方式太占用空间,所以传统的版本控制系统都是保存一个文件的某个版本的全部内容以及其他版本相对于这个版本的更改,这样就节省了大量的空间。
不过Git却反其道而行之,采用了类似生成副本的方式保存每一次更改,我们称之为快照。
如果还有疑惑,下面我们会详细介绍这张图代表的意思。
二、存储对象类型
Git中有很多存储对象,这里我们着重讲解其中的三个:Blob(块)、Tree(目录树)、Commit(提交)。
1、Blob(块)
文件的每个版本对应一个块,块里面只包含每个文件的内容,不包含其他任何信息。
例如 1.txt 文件修改过两次且内容不相同,那在git的版本库中就会生成两个块文件,每次修改对应一个块文件。
块文件是根据文件内容生成的二进制大对象,相同的文件指向相同的块文件。比如 1.txt 和 2.txt 中的文本内容一模一样,那这两个文件指向同一个块文件。
2、Tree(目录树)
目录树里包含的是当前这个树下的所有文件路径以及子树,从而形成一个完整的目录结构。
目录树里有指向块的索引。
3、Commit(提交)
提交里面记录的是每次提交的元数据,包括作者、时间以及提交内容等。
每一个提交对象指向一个树对象,树对象则包含了此次提交后的完整目录信息。
每一个提交对象都有一个父提交,除了第一次提交对象以外。

这张图片的每个Commit就对应着最上面那张图片的版本。这样从 提交 到 树 再到块,一层层的嵌套下去。
下一篇文章我们讲解Git里面是如何构建这张图片的。

Git系列教程二 基础介绍的更多相关文章

  1. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  2. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

  4. webpack4 系列教程(二): 编译 ES6

    今天介绍webpack怎么编译ES6的各种函数和语法.敲黑板:这是webpack4版本哦, 有一些不同于webpack3的地方. >>> 本节课源码 >>> 所有课 ...

  5. spring cloud系列教程第一篇-介绍

    spring cloud系列教程第一篇-介绍 前言: 现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了.那么,微服务只是指spring boot吗?当然不是了,微 ...

  6. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  8. [译]Atlassian Git系列教程

    国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...

  9. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

随机推荐

  1. C++成员初始化顺序

    #include <iostream> using namespace std; int seti() {cout << "seti" << e ...

  2. table 相关

    border-collapse: collapse; 合并多余边框

  3. phpcms手机门户相关

    相关标签 {$WAP['sitename']}标题 {list_url(3)} 调取栏目链接 {template "wap","header"}{templat ...

  4. Hibernate一对一、一对多、多对多注解映射配置

    一对一: 一对多: 多对多:

  5. VMware中的Ubuntu网络设置

    网络配置: VMware安装后会有两个默认网卡,分别是VMnet8(192.168.83.1)和VMnet1(192.168.19.1),当然不同的机器上,这两个网卡的 IP会不同的.在windows ...

  6. JQuery 菜鸟笔记(一)

    什么是JQuery JQuery是一个优秀的javascript类库,jQuery以其简洁.快速等优点征服了众多javascript开发者.jQuery使用户能更方便地处理DOM.events.实现动 ...

  7. [Linux]系统调用理解(3)

    本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...

  8. Python之反射,正则

    本节主要内容: 一. 反射: getattr hasattr setattr defattr 二. 补充模块中特殊的变量 三. 正则表达式 re模块 (一)反射: hasattr(object, na ...

  9. struts2学习记录

    1.对于使用Struts2框架的应用而言,尽量不要让超级链接直接接到某个视图资源,因为这种方式增加了额外的风险.推荐将所有请求都发送给Struts框架,让该框架来处理用户请求,即使只是简单的超级链接. ...

  10. Mac下Boost环境搭建

    Boost,一个功能强大.跨平台.开源而且免费的C++程序库,可以在其官网了解更多:http://www.boost.org,C++标准经过不断的升级完善,现在已经功能越来越吸引人了,Boost开发过 ...