面试官:说说Git 中 HEAD、工作树和索引之间的区别?

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

[[417066]]

本文转载自微信公众号「JS每日一题」,作者灰灰。转载本文请联系JS每日一题公众号。

一、HEAD

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

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

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

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

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

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

  1. $ cat .git/HEAD 
  2. ref: refs/heads/master 
  3.  
  4. $ cat .git/refs/heads/master 
  5. 7406a10efcc169bbab17827aeda189aa20376f7f 

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

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

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

二、工作树和索引

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

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

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

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

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

三、区别

从所在的位置来看:

  • HEAD 指针通常指向我们所在的分支,当我们在某个分支上创建新的提交时,分支指针总是会指向当前分支的最新提交
  • 工作树是查看和编辑的(源)文件的实际内容
  • 索引是放置你想要提交给 git仓库文件的地方,如工作树的代码通过 git add 则添加到 git 索引中,通过git commit 则将索引区域的文件提交到 git 仓库中

参考文献

https://backlog.com/git-tutorial/cn/intro/intro1_4.html

https://juejin.cn/post/6844903598522908686 

https://www.zsythink.net/archives/3412

 

责任编辑:武晓燕 来源: JS每日一题
相关推荐

2021-08-19 08:36:22

Git ResetGit Revert版本

2021-08-17 07:15:16

Git RebaseGit Merge面试

2021-08-09 07:47:40

Git面试版本

2024-03-11 18:18:58

项目Spring线程池

2021-08-11 08:53:23

Git命令面试

2021-09-30 07:57:13

排序算法面试

2021-04-30 08:28:15

WebpackLoaderPlugin

2021-09-13 09:23:52

TypeScript命名空间

2021-06-29 09:47:34

ReactSetState机制

2024-03-28 10:37:44

IoC依赖注入依赖查找

2023-12-27 18:16:39

MVCC隔离级别幻读

2024-11-19 15:13:02

2021-10-15 09:53:12

工具

2021-08-18 08:33:11

Git场景命令

2021-08-16 08:33:26

git

2024-05-30 08:04:20

Netty核心组件架构

2024-03-05 10:33:39

AOPSpring编程

2024-08-22 10:39:50

@Async注解代理

2021-08-10 08:34:12

Git ForkBranch

2021-07-14 08:00:13

reactCss模块
点赞
收藏

51CTO技术栈公众号