Git对象
  • 版本控制在于文件的控制,git的控制方法在于为每个文件生成(key,object)的结构。git利用sha-1加密算法,对每一个文件生成一个唯一的字符序列(明文大小不超过2^64位,对于普通文件,这个大小都可以满足)作为hash_key。
  • init初始化一个本地仓库,打开隐藏目录.git,其内容如下图。可以看到一个objects的目录,里面只有info和pack两个空文件夹。初始化的时候不存在任何object,也就是没有任何文件被记录下来。
  • 在Git系统中有四种类型的对象,几乎所有Git操作都是在这四种Git对象上进行的,所以了解这四种对象的作用对于应用Git有很大帮助。这四种对象是:
  • “blob”:一个“blob”通常用来存储文件的内容。一个“blob”对象就是一块二进制数据,它没有指向任何东西或有任何其它属性,甚至没有文件名。因为“blob”对象内容全部都是数据,所以如若两个文件在一个目录树或是一个版本仓库中有同样的数据内容,那么它们将会共享同一个“blob”对象。“blob”对象和其所对应的文件所在路径、文件名是否改被更改都完全没有关系。
  • 我们在工作目录下添加一个文件readme,里面只要一个字符串"file1 content",使用git hash-object [文件名],可以查看其经过算法生成的hash-key.这个一个40个字符长度的序列。
  • 查看object
  • 执行:git add readme 将文件加入到暂存区之后再次查看
  • 查看3d目录下的内容,可以看到40位的hash-key 前两位作为目录名,后38位作为文件名,标识了这个object对象,这个对象里面的内容就是刚才readme里的内容,可以查看这个对象的内容和对象类型:
  • “tree”:像一个目录,管理一些“tree”对象或是“blob”对象。它有一串指向“blob”对象或是其它“tree”对象的指针,一般用来表示内容之间的目录层次关系(就像文件和子目录)。它的树节点信息包含文件名,hash-key,文件类型、权限等等。这样就可以组织整个需要控制文件的结构
  • 工作目录下添加一个目录dir_1,在dir_1添加一个文件1.txt 内容随意
  • 使用git add . 将文件加入暂存区,查看该文件的hash-key git hash-object
  • 查看object文件夹内容
  • 只存在一个6d的目录,也就是b138a对应的1.txt文件,这时我们的目录并没有生成tree对象,tree对象是在commit的过程中生成的,其生成会根据.git目录下的index文件的内容来创建。git add的操作就是将文件的信息保存到index文件中,在commit时,根据index的内容来生成tree对象。
  • 使用git ls-files --stage命令,我们看看index里的类容:

  • 我们进行第一次commit,生成commit对象,同时生成tree对象,master^{tree},表示master分支所指向的tree对象。
  • 目前我们的git仓库的内部结构如下:
  • “commit”:“commit”对象指向一个“tree对象”,并且带有相关的描述信息,标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交的指针等等。
  • 刚才的总体tree图,只包含了四个对象,我们使用git log查看commit的历史
  • 其中的fd对应的文件夹就是我们的commit对象,它指向工作目录tree,和上一次的commit,这是第一个commit ,所以上一个commit不存在。
  • 现在我们在工作加入一个新的目录dir_2,和该目录下文件2.txt
  • 查看对象信息
  • 这个tree包含了当前的文件目录和内容,现在我们的对象完整的图如下:
  • ps:可以看到commit对象指向了工作目录tree,这样只要切换commit,就可以随意切换我们的版本类容

PS:在Git中blob、commit和tree对象的关系看起来会如下图:

命令总结

版本控制-Git对象的更多相关文章

  1. 版本控制git之五-标签管理 tags 标签 代码版本 如: v1.0

      版本控制git之五-标签管理 打标签 像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要. 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等). ...

  2. 版本控制git之一 仓库管理 安装 基础

      版本控制git之一-仓库管理 git ​ 再开始这个话题之前,让我想起了一件很痛苦的事情,在我大学写毕业论文的时候,我当时的文件是这样保存的 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业 ...

  3. 版本控制Git(1)——理解暂存区

    一.svn和Git的比较 我们都知道传统的源代码管理都是以服务器为中心的,每个开发者都直接连在中间服务器上, 本地修改,然后commit到svn服务器上.这种做法看似完美,但是有致命的缺陷. 1. 开 ...

  4. 版本控制git之二 分支 切换分支 创建分支 合并 删除

      版本控制git之二 分支   有人把 Git 的分支模型称为它的`‘必杀技特性’',也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出. 为何 Git 的分支模型如此出众呢? Git 处 ...

  5. 『现学现忘』Git对象 — 15、blob对象介绍

    目录 (一)Git对象的存放目录 (二)Git中对象类型 (三)blob对象 1.blob对象说明 (1)blob对象定义 (2)blob对象说明 (3)blob对象存储的方式 (4)查看blob对象 ...

  6. 『现学现忘』Git基础 — 18、Git对象的总结

    目录 1.Git操作最基本的流程 2.工作目录中文件的状态 3.Git效率说明 提示:前面三篇文章已经分别的对blob对象.tree对象.commit对象进行了详细的说明,这篇文章我们总结一下,Git ...

  7. iOS版本控制git小结--yoowei

    # 显示隐藏文件 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder # 不显示隐藏文件 d ...

  8. 完整学习git四git对象

    1查看git对象 git cat-file 实践 git head到底指向的是什么 ➜ gittest git:(master) find .git -name HEAD -o -name maste ...

  9. git对象存储

    之前提到当存储数据内容时,会在objects文件夹下存储一个git对象.我们花些时间来看看 Git 是如何存储对象的.你将看来如何通过 Ruby 脚本语言存储一个 blob 对象 ,有必要了解一下对象 ...

随机推荐

  1. block,inline,inline-block的区别

    最近正在复习,紧张地准备几天后的笔试,然后刚好看到这个地方. block:块级元素,会换行,如div,p,h1~h6,table这些,可以设置宽高:    inline:行内元素,不换行,挤在一行显示 ...

  2. Python:main函数

    什么是函数? 一个程序可以包含多个模块,程序越复杂,包含的模块和功能就越多,模块细分里面包含多个类,类这个概念在任何一门面向对象语言里面都很重要,在类里面最主要的就是包含的函数,函数式实现某一个功能的 ...

  3. SpringMvc笔记-注解

    @RequestParam(value = "username", defaultValue = "haha", required = true) 有四个参数 ...

  4. linux中/bin和/sbin和/usr/bin和/usr/sbin

    首先先解释一下bin和sbin的意思: 1.bin:为任何用户都可以使用的指令 2.sbin:(super bin)也就是只有超级管理员才能使用的指令 /usr    UNIX Software Re ...

  5. 关于c++栈溢出的问题

    我自己定义了一个数据类型node,嵌套在另一个数据类型当中时候,用到了delete函数, 在我node的声明当中声明了几个指针 在我的析构函数中却调用了delet函数 结果程序结果是能跑出来 提示我栈 ...

  6. hihoCoder 1288 Font Size 二分

    题意:给定一个宽度为和高度为的屏幕,如果字体的大小为,那么一行可以显示个字,每一页可以显示行.给出段文本段落,每段有个文字,问现在能设置的最大字体并且总的页数不能超过? 思路:如果知道字体大小很容易求 ...

  7. HDU - 1907 John 反Nimm博弈

    思路: 注意与Nimm博弈的区别,谁拿完谁输! 先手必胜的条件: 1.  每一个小游戏都只剩一个石子了,且SG = 0. 2. 至少有一堆石子数大于1,且SG不等于0 证明:1. 你和对手都只有一种选 ...

  8. 2018.3.6学习java的第一天

    学习java,那么不得不先了解一下java,java分为三部分,JAVA SE,JAVA EE和JAVA ME,其中前期我们首先要学习Java SE.java是一门语言,我们平时人与人之间对话,用中文 ...

  9. 【前端】Vue2全家桶案例《看漫画》之三、引入vuex

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_3.html 项目github地址:https://github.com/shamoyuu/ ...

  10. AndFix

    AndFix 是阿里巴巴开源的 Android 应用热修复工具,帮助 Anroid 开发者修复应用的线上问题.Andfix 是 "Android hot-fix" 的缩写.支持 A ...