当我在使用git的时候,有三个东西的出现,一度让我非常困扰,就如题所述,staging,index,和cache。

比如,当我阅读git官网提供的电子书《Pro Git》的时候,最初一章里,就提到,文件在git里面,有三种状态,working copy,staging area,和 in repository。而在读一些man pages的时候,比如git-reset命令,又会看到index,这非常让人困扰。而git-rm 指令又有一个参数叫 -cached,其作用是”unstage and remove paths only from the index”,更加奇怪了,同时提到了stage和index,而参数名竟然是cached!!!

这三者的来龙去脉到底怎么回事?搞清楚这些问题,对于喜欢刨根究底的我来说,极其重要。通过谷歌,我找到了一个叫Junio C Hamano的日本小哥,他是git的核心维护者之一,讲述了这三者的故事。本文主要内容从那个文章中解读出来,添加了一些自己的理解,不感冒的同学,请直接阅读原文。

读完原文后,我的基本感觉是,这些都是Linus大神当时的一念之差和命名的随意性搞出来的问题。

原来,Linus当年在维护Kernel的时候,使用了一种叫做“tarball and patches”的工作流模型(什么鬼?),具体原理没搞懂,我理解的意思,他要研究每个Kernel的patch对Kernel到底有什么影响。例如,他有一个2.6.12的tarball,还有 patch-1,patch-2 两个,所以,他至少要弄出来三个新版本,2.6.12-patch1,2.6.12-patch2,2.6.12-patch1&2。区区两个patch就搞出了3个新版本,如果patch多了不堪重负。

于是,他发明了一个“目录缓存(directory cache)”,其实就是现今git中的tree的概念,这个tree上的每个节点,都是一个Kernel的整个目录结构和文件(用一种高度压缩的形式表示的)。构建这个tree的方法,就是将内容添加到“缓存cache”,或者“更新缓存cache中的内容”。

用来存储这个树状结构的目录,叫“.dircache”(现在叫“.git”)。这个目录里,有个文件叫index,在git源码里(用C写的),操作这个index的各种变量名称,都有个前缀叫“cache”。这个index文件的作用,就是决定你要将什么文件,最终写入到那个树状结构里的,index就是暂存用的缓冲区。(可以看出来,这个树状结构,其根本作用就是维护海量的版本,其实就是git版本库本身了)(开发团队里的)每个人,都混用cache和index两个词,因为记录缓冲区(cache)内容的文件名,叫index。如果你给定文件路径,就能从index文件中找出来你要提交的内容(现在依旧如此)。

现在,越来越多的人,不需要通过阅读git的源码,就可以使用git了(因为有了文档和很多书籍,从应用层面介绍了很多的git知识,所以不需要从源码里找到所有秘密了:D)。所以,index这个名字变得越来越流行,因为这个文件会出现在.git目录里,而源代码里,cache开头的那些变量却不为人知。最终,我们(git开发团队)不再使用cache这个单词给小白用户(End User)解释问题了,但是当我们讨论git内部数据结构和git实现的时候,还是会用到cache这个词。

对于小白用户来说,现在 cache 这个词都以过去分词 cached 的形式出现,其词性是形容词了。表示要讨论的内容目前位于index文件中,而不是在工作目录(work tree)里面。(假如,我在工作目录里修改了一个文件,使用 git-add 命令,我修改的部分内容 —— 相当于一个patch —— 会在index里出现,但是在我的工作目录里,当然也还是有我修改的内容的,不过是叠加在版本库中的文件上的)。当然,我们也可以用 “indexed” 这个词,但是 “cached contents”,在英语里是个词组,早已存在,表达的就是这个意思,所以我们不需要再发明一个词来说明这个意思,就用了cached了(我了个去啊 >-

git术语解释staging,index,cache的更多相关文章

  1. Spring AOP术语解释

    话说,越来越感觉有些人解释概念真的是晦涩难懂,我刚开始学习Spring aop时,对那些切入点,连接点,引入等概念搞得头疼.太多人就直接照搬定义,让我们这些初学者如何理解啊.下面是我找了大量的博客,终 ...

  2. k8s~术语解释

    文章参考:https://www.kubernetes.org.cn 简介 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简 ...

  3. 【SSO单点系列】(6):CAS4.0 单点流程序列图(中文版)以及相关术语解释(TGT、ST、PGT、PT、PGTIOU)

    CAS 相关的内容好久没写了,可能下周会继续更新一些内容吧. 在上一篇中的单点流程序列图由于是从官网直接下载来的,上面都是英文,可能有的朋友看不懂,因此修改成中文的. PS:只修改了一个,第二个图明天 ...

  4. 【java】 field 和 variable 区别及相关术语解释

    Having said that, the remainder of this tutorial uses the following general guidelines when discussi ...

  5. Listening-lecture|主旨题|术语解释|举例原则|Crash course 哔哩哔哩

    Listening-lecture: Major topic: SP1---detail---detail---detail SP2---detail---detail---detail Crash ...

  6. 图像处理术语解释:什么是PRGBA和Alpha预乘(Premultiplied Alpha )

    ☞ ░ 前往老猿Python博文目录 ░ Alpha预乘(Premultiplied Alpha)和PRGBA 一般来说四通道图像数据保存的都是ARGB或RGBA,其R.G.B值还没有进行任何透明化处 ...

  7. Pomelo术语解释

    gate服务器 一个应用的gate服务器,一般不参与rpc调用,也就是说其配置项里可以没有port字段,仅仅有clientPort字段,它的作用是做前端的负载均衡.客户端往往首先向gate服务器发出请 ...

  8. git报错之index.lock

    当想回退到某个版本的时候,用git reset --hard commit_id,发现报错,原因是.git目录下多了个index.lock文件,可以通过rm命令删除,然后再回退 rm -f ./.gi ...

  9. git —— 异常1,index.lock

    git提交过程中出现的问题 解决方法:找到 index.lock文件将其删除 一般 index.lock 在.git下面, 有时 .git 是隐藏的,但是无论怎样, 可以通过 everything 找 ...

随机推荐

  1. JDBC编程之优化

    1.创建 dbconfig.properties driver=com.mysql.jdbc.Driver dburl=jdbc\:mysql\://localhost\:3306/mytest us ...

  2. MYSQL触发器学习笔记

    课程学至金色晨曦科技公司技术总监沙利穆 触发器 1.       什么是触发器 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执 ...

  3. 成都传智播客java就业班和基础班

    传智播客成都Java培训,带你走进Java的世界... 我们有咨询的教育团队,一流的名师指导: 我们是重视基础理论建设,强化高端应用技能: 我们有四大JavaEE项目,海量Android项目: 我们是 ...

  4. jQuery -> 获取兄弟元�

    获取指定元素的兄弟元素时,能够使用adjacent sibling combinator (+),当中+的两側内容都是selector expression. 假设要获取下例中全部的 h1的直接兄弟元 ...

  5. 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...

  6. sql server里一些常用的查询

    查看表的创建和更改时间:  select * from sys.tables    查询数据库的创建时间: select * from sys.databases where name in ('数据 ...

  7. OD: Big_Endian vs Little_Endian

    经调试,Windows 下为 Little_Endian,OD 中堆栈数据区的 (dword)0xAABB0102,0x02 存储在低地址,0x01 存储在高地址. 内容来自:http://blog. ...

  8. c标签的使用方法

    1. c:forEach <c:forEach items="> 注意varStatus相当于for循环计数器,从1开始,用${varStatus.count}获得计数器的值.而 ...

  9. 如何改写WebApi部分默认规则

    为什么要改 最近公司在推广SOA框架,第一次正经接触这种技术(之前也有但还是忽略掉吧),感觉挺好,就想自己也折腾一下,实现一个简单的SOA框架 用过mvc进行开发,印象之中WebApi和Mvc好像是一 ...

  10. 3.class文件基本结构

    转 http://blog.csdn.net/luanlouis/article/details/39892027 [last updated: 2014/11/19 09:06] 作为Java程序猿 ...