一、HEAD

git中,可以存在很多分支,其本质上是一个指向commit对象的可变指针,而Head是一个特别的指针,是一个指向你正在工作中的本地分支的指针

简单来讲,就是你现在在哪儿,HEAD 就指向哪儿

例如当前我们处于master分支,所以HEAD这个指针指向了master分支指

然后通过调用git checkout test切换到test分支,那么HEAD则指向test分支,如下图:

但我们在test分支再一次commit信息的时候,HEAD指针仍然指向了test分支指针,而test分支指针已经指向了最新创建的提交,如下图:

这个HEAD存储的位置就在.git/HEAD目录中,查看信息可以看到HEAD指向了另一个文件

$ cat .git/HEAD
ref: refs/heads/master $ cat .git/refs/heads/master
7406a10efcc169bbab17827aeda189aa20376f7f

这个文件的内容是一串哈希码,而这个哈希码正是master分支上最新的提交所对应的哈希码

所以,当我们切换分支的时候,HEAD指针通常指向我们所在的分支,当我们在某个分支上创建新的提交时,分支指针总是会指向当前分支的最新提交

所以,HEAD指针 ——–> 分支指针 ——–> 最新提交

二、工作树和索引

Git管理下,大家实际操作的目录被称为工作树,也就是工作区域

在数据库和工作树之间有索引,索引是为了向数据库提交作准备的区域,也被称为暂存区域

Git在执行提交的时候,不是直接将工作树的状态保存到数据库,而是将设置在中间索引区域的状态保存到数据库

因此,要提交文件,首先需要把文件加入到索引区域中。

所以,凭借中间的索引,可以避免工作树中不必要的文件提交,还可以将文件修改内容的一部分加入索引区域并提交

三、区别

从所在的位置来看:

  • HEAD 指针通常指向我们所在的分支,当我们在某个分支上创建新的提交时,分支指针总是会指向当前分支的最新提交

  • 工作树是查看和编辑的(源)文件的实际内容

  • 索引是放置你想要提交给 git仓库文件的地方,如工作树的代码通过 git add 则添加到 git 索引中,通过git commit 则将索引区域的文件提交到 git 仓库中

Git 中 HEAD、工作树和索引之间的区别的更多相关文章

  1. Spring中Model、ModelMap及ModelAndView之间的区别

    Spring中Model.ModelMap及ModelAndView之间的区别   1. Model(org.springframework.ui.Model)Model是一个接口,包含addAttr ...

  2. C#中string.Empty、""和null 之间的区别

    1.C#中string.Empty.""和null 之间的区别 (http://blog.csdn.net/henulwj/article/details/7830615)

  3. Android中dip, dp, px,pt, sp之间的区别:

    Android中dip.dp.sp.pt和px的区别   1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更 ...

  4. iOS中assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  5. mysql 中execute、executeQuery和executeUpdate之间的区别

    在用纯JSP做一个页面报警功能的时候习惯性的用executeQuery来执行SQL语句,结果执行update时就遇到问题,语句能执行,但返回结果出现问题,另外还忽略了executeUpdate的返回值 ...

  6. C++中指针和引用、数组之间的区别

    指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名,引用初始化后不能改变指向.使用时,引用更加安全,指针更加灵活. 初始化.引用必须初始化,且初始化之后不能呢改变:指针可以不必初始化 ...

  7. Mysql 主外键与索引之间的区别和联系

    系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部 ...

  8. iOS中assign,copy,retain之间的区别以及weak和strong的区别(面试)

    • copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象. • assign:  简单的直接赋值,相 ...

  9. Java中Scanner类和BufferReader类之间的区别

    java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...

  10. mysql中几个日期时间类型之间的区别和使用

    MySQL中有如下几个时间类型:date.time.datetime.timestamp.year MySQL数据类型           含义 date                     只存 ...

随机推荐

  1. 辨析Java与网络通信中的编码与解码

    在Java字符流上下文中的编码和解码,以及在网络通信中的编码概念. 在Java中,当我们谈论字符流(如Reader和Writer)时,编码和解码主要涉及将字符数据转换为字节数据,以及将字节数据转换回字 ...

  2. Python 动态网页Fetch/XHR爬虫——以获取NBA球员信息为例

    Python 动态网页Fetch/XHR爬虫--以获取NBA球员信息为例 动态网页抓取信息,一般利用F12开发者工具-网络-Fetch/XHR获取信息,实现难点有: 动态网页的加载方式 获取请求Url ...

  3. 对角矩阵try

    \begin{bmatrix}1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\end{bmatrix}

  4. 5G+云渲染:如何快速推进XR和元宇宙实现?

    XR(扩展现实)领域正在以惊人的速度增长.目前,到 2024 年,一些专家表示这个行业的价值将达到 3000 亿美元. 这个行业发展如此迅速的部分原因是 XR 将在商业环境中的带来巨大利益.近年来,很 ...

  5. 在Blazor中使用Chart.js快速创建图表

    前言 BlazorChartjs是一个在Blazor中使用Chart.js的库(支持Blazor WebAssembly和Blazor Server两种模式),它提供了简单易用的组件来帮助开发者快速集 ...

  6. Flutter如何状态管理

    目录介绍 01.什么是状态管理 02.状态管理方案分类 03.状态管理使用场景 04.Widget管理自己的状态 05.Widget管理子Widget状态 06.简单混合管理状态 07.全局状态如何管 ...

  7. js原型详解

    js中的原型毫无疑问一个难点,学习如果不深入很容易就晕了! 任何一个js知识点,比如事件流,闭包,继承等,都有许许多多的说法,对于这些知识点我们都应该先熟练的使用,然后自己整理一套属于自己的理解说辞, ...

  8. uniapp热更新和整包更新思路

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 我们知道,在打包Android App之前,我们需要先通过HX生成打包资源.如果是通过cli创建的项目,则通过以下命令生成打包资源: ya ...

  9. 【IOT安全】ASA5520基本知识和配置

    本文主要介绍ASA5520防火墙的基本知识和配置 环境搭建 Linux eveng 5.17.8-eve-ng-uksm-wg+ #1 SMP PREEMPT Mon May 16 10:08:59 ...

  10. 带你快速入坑ES6

    一.了解ES6 1)ES6官网:http://www.ecma-international.org/ecma-262/6.0/ 2)Javascript是ECMAScript的实现和扩展 3)ES学习 ...