Git 天天用 但是 Git 原理你了解吗?

article/2025/9/11 17:25:37

前言

做技术一定要知其然知其所以然,意思就是:知道它是这样的,更知道它为什么是这样的。我主要通过4块内容来简单介绍 Git 原理是什么样的。这4块内容如下:

  • Git 存储目录结构介绍
  • Git 是如何存储的
  • Git 的对象
  • Git引用

当然 Git 原理不仅仅包含这些,想要更深入了解请查看官方教程 https://git-scm.com/book/zh/v2/。

本文内容是我在 GitChat 分享关于Git 的Chat 《Git实用操作手册》 摘抄一个章节,关于《Git实用操作手册》其他内容请访问 https://gitbook.cn/gitchat/activity/5cb46e9dd877c443a183f9d4。

Git 存储目录结构介绍

首先我们先从 Git 存储目录说起,通过 git init 创建一个空的 Git 仓库,具体操作如下图:

在这里插入图片描述

创建完成后进入 .git 目录,如下图所示:

在这里插入图片描述

  • hooks 该目录用于配置 客户端执提交操作用于触发服务端的脚本配置,一般用于自动化部署使用
  • info 该目录用于配置一些不希望被 Git 管控的文件。
  • objects 该目录用于存储所有数据对象内容,这些数据内容类型有 commit tree blob tag
  • refs 该目录用于存储 Git 本地以及远程分支的引用,当然还有一种特殊的引用标签引用
  • config 该文件包含项目特有的配置选项,并且该配置仅对该 Git 仓库有效
  • description 该文件仅供 GitWeb 程序使用
  • HEAD 该文件表示当前 Git 仓库处于哪个分支
  • index 该文件保存暂存区信息 (空仓库下该文件不会显示一旦执行 git add 操作该文件就会出现)

通过 git config --local 查看 config 文件的变化

我们通过 git config --local 配置仅对于 gitLearn 项目有效,用户名和邮箱配置如下图所示:

在这里插入图片描述

查看 config 文件,会发现该文件新增用户信息配置。

在这里插入图片描述

Git 是如何存储的

Git 是一个内容寻址文件系统 其核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个 40 位字符串键,通过该 40 位字符串键可以在任意时刻再次检索(retrieve)该内容。

什么是内容寻址?

每次我们进行提交会通过 SHA-1 算法生成一个长度为 40 个字符的校验和(checksum hash)(也就是我们的 key)然后根据校验和去获取我们文件的内容。这种通过唯一标识的 key(也可以理解为内容的地址)去获取我们的内容的操作就是内容寻址

Git 的对象

在 Git 中有四种对象分别为:

  • blob 是具体的文件对象
  • tree 是某个时刻提交目录的内容
  • commit 执行一次 commit 就会产生一个 commit 对象
  • tag 可以理解成 commit 的别名,一个 tag 对应一个 commit

了解 Git 的对象需要使用如下命令进行查看:

  • git cat-file -p 对象 hash 值 查看对象的内容
  • git cat-file -t 对象 hash值 查看对象的类型
  • git ls-files --stage 查看 index 文件内容
  • git hash-object 查看文件的 hash 值

查看 commit tree blob 三个对象演示

我们创建一个 first.txt 文件,并将其提交到暂存区中。

在这里插入图片描述在这里插入图片描述

进入 .git 文件夹下会发现新增了一个 index 文件。

在这里插入图片描述

我们可以通过 git ls-files --stage 查看 index 文件的内容。

在这里插入图片描述

进入 objects 目录发现 9c 文件夹名称+文件名称 和 index 文件中的一段字符串内容相同。

在这里插入图片描述

我们通过 git cat-file -t 9c59e24b8393179a5d712de4f990178df5734d99 我查看该表示对象类型 如下图所示表示该标识对象类型是 blob

在这里插入图片描述

执行 git commit -m 将 first.txt 文件提交到本地仓库中。

在这里插入图片描述

执行 git log 查看我们的提交记录。

在这里插入图片描述

如下图所示我们通过 git cat-file -p commitId 查看我们提交的内容。如下图所示:我们最新一次提交包含了一个 59b06 开头的 tree 对象。

在这里插入图片描述

在 ./git/objects 目录中可以找到我们对应的文件。
在这里插入图片描述

我们通过 git cat-file -p tree对象哈希值,查看该 tree 对象的内容 。如下图所示显示就是我们 git add参生的 blob对象。

在这里插入图片描述

在通过 git cat-file -p blob对象哈希值,查看我们 blob对象内容,如下图所示 blob对象 内容就是我们 first.txt 文件的内容。

在这里插入图片描述

我们将 first.txt 文件提交到本地仓库 会产生一个 commit 一个 tree 和一个 blob 对象。

tag 对象原理演示

首先我们通过 git log 查看最新的提交是 add a.txt 注释的 commit 如下图所示。

在这里插入图片描述

通过 git tag -a v1.1 -m ‘add a.txt tag’ 为该 commit 创建一个附注标签。

在这里插入图片描述

在我们的 .git/refs/tags/ 目录下会新增 v1.1 文件。

在这里插入图片描述
v1.1 内容如下:

在这里插入图片描述

看到这个你肯定想到了这是一个 Git 对象,我们通过 git cat-file -t 查看这个哈希值对象类型。如下图所示它是一个 tag。

在这里插入图片描述

然后通过 git cat-file -p 查看它的内容,如下图所示,该tag包含了commit 对象和 标注的信息。

在这里插入图片描述

Git 引用

什么是 Git 的引用?

这里的引用我们可以理解成一个书签,你在阅读一本书的时候可以为你读到的部分打上标签。然后你可以通过这个书签快速找到你之前阅读的位置。在 Git 中我们 创建新的 Commit 或者创建分支都会进行一次打标签的操作。我们各个不同 commit 之间的切换或分支的切换其实就是标签的切换。

Git 引用的三种类型

在 Git 中有三种类型的的引用 分别是:

  1. HEAD 引用:用来为我们的本地仓库打上标签使用。
  2. Tag 引用:用来为我们的 Git 仓库 tag 标签使用。
  3. 远程引用:用来为我们的远程仓库打标签使用。

HEAD 引用

HEAD 引用原理 我的个人理解是一个 Head 头指针+当前分支 指向当前最新提交的 commit 对象。我们也可以通过 git reset --hard 来切换我们commit 记录,切换后的 commit 以前的 commit 记录就没有了,不过我们可以通过 git reflog 查询操作记录将以前 commit 找回。

为了更好的理解 HEAD,引用建议大家访问 http://onlywei.github.io/explain-git-with-d3/#zen 执行 Git 相关的操作来理解什么是 HEAD引用。

如下图所示,我们的 Head头指针分支 指向 master分支 同时指向最新的 commit e137e。

在这里插入图片描述
我们执行一次 commit Head头指针分支 + master分支 就指向的是最新的提交 896ee 上。

在这里插入图片描述

通过 git branch b1 创建新的分支名称为b1,如下图所示,我们发现 Head 头指针还是指向 master 。

在这里插入图片描述

当执行 git checkout b1 的时候,如下图所示,此时 Head 指针指向分支 b1。

在这里插入图片描述

我们在分支 b1 上执行 commit Head 指针指向了在该分支下的最新提交 3c7acb。

在这里插入图片描述

当执行 git checkout master 是 Head 指针指向了 master 上最新的 commit 896ee。

在这里插入图片描述

当执行 git merge b1 的时候,会将 b1分支最新 commit 合并到 master,我们 Head指针 + master 同时指向最新的 commit 3c7ba 上。

在这里插入图片描述

通过上面的动态演示,这回对 Head 应用如何切换 commit 切换分支有了一定的理解。

这里非常建议你自己通过访问
http://onlywei.github.io/explain-git-with-d3/#zen
来亲自体验一下。

接下来我们来通过查看 .git 目录来介绍 Head 指针是如何实现的。进入 .git 目录你会发现有一个 HEAD 文件,它的内容是 ref: refs/heads/master,如下图所示。

在这里插入图片描述
在这里插入图片描述

refs/heads/master 是具体文件路径,我们查 refs/heads 目录下的 master 文件内容,如下图所示,master 文件内容就是我们最新的 commit。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们执行 git chekcout demoBranch3。

在这里插入图片描述
在这里插入图片描述

此时我们的 HEAD 文件内容变成了 ref: refs/heads/demoBranch3。

在这里插入图片描述

查看 refs/heads/ 路径下的 demoBranch3 文件,如下图所示 demoBranch3 文件记录是demoBranch3 分支下最新的 commit。

在这里插入图片描述

在这里插入图片描述

标签引用

标签引用是一个特殊的引用,它不像 HEAD 引用可以通过 git checkout 来更改引用的指针指向。标签引用不会移动它永远会指向一个 Commit 对象。

标签引用的演示请参看 Tag 对象原理演示部分

远程引用

  1. 远程引用是只读的我们不能通过切换到远程引用执行 commit 将提交更新到远程仓库中

  2. 我们在本地分支执行 push 操作,Git 都会帮我们记录 push 到远程分支的最新 comit,当执行push 的时候,如果发现远程分支最新 commit 和我们本地仓库记录最后一次 push 的 commit 不同会报 Note about fast-forwards 异常,如下图所示:

在这里插入图片描述

出现 Note about fast-forwards 我们需要执行 git pull 将远程最新的 commit 拉取下来 然后再执行 git push 操作 或者 直接执行 git puhs -f。这里强调一下不建议执行 git puhs -f 操作因为会强制将本地的历史记录覆盖到远程仓库的历史记录。

通过查看 .git 目录理解远程引用

在 .git/refs/remotes/origin 文件夹中 HEAD 文件内容表示内容表示远程分支处于哪个分支。

在这里插入图片描述

在 .git/refs/remotes/origin 文件夹中 master 文件内容,表示最后一次 push 到远程仓库的commit,如下图所示:

在这里插入图片描述
在这里插入图片描述

在 .git/refs/remotes/origin 文件夹中 demoBranch1 文件表示,最后一次 push 到 demoBranch1 分支提交的 commitId。

在这里插入图片描述
在这里插入图片描述

参考文献

Git 官方教程


http://chatgpt.dhexx.cn/article/F9Jqhpjt.shtml

相关文章

(一篇就够)git原理深入理解

深入理解git原理 1:git工作模式 基本步骤: 1.workspace 本地工作空间add命令 提交到本地缓存 2、localcache本地缓存commit命令提交到本地仓库 3、localRepository本地仓库push命令提交到远程仓库 拉取步骤: clone 克隆到本地仓库 checkout…

git原理笔记(一)

git原理笔记(一) 这个笔记是对于git内部原理的一个理解。网上很多关于git的用法的教程。这里推荐廖雪峰的git教程。 这里主要记录如下的内部原理的理解 1. git如何存储 2. git如何管理版本 一. git如何存储 常常在使用git的过程中&#…

git工作原理

一. git工作原理 二. git分支标准流程 三. git工具:sourcetree 待续知识分享

git原理和常用命令

git git介绍git工作流程git的几个核心概念 git常用命令参考资料 git介绍 git-分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 git特点 优点: 适合分布式开发,强调个体; 公共服务器压力和数据量都不会太…

Git分支原理

Git分支原理 前言 最近工作由SVN换成Git了,不由地想探寻一下这两种版本控制工具的差别到底在哪里,于是有了这篇笔记。 Git保存方式 Git和SVN的差别主要就在于对待数据的方式。 SVN将存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异&…

git fetch工作原理

背景 相信大家都知道git pull命令相当于git fetch加git merge。那么直接使用git pull和分开使用有什么区别呢&#xff1f;要解答这个问题首先要想了解git fetch的工作原理是什么样的。 git fetch的工作原理 先讲一下什么是远程跟踪分支。远程跟踪分支以 <remote>/<…

Git原理入门解析

前言: 自己第一次听到Git应该是一年前了,当时很懵,不知道它是干啥的,在网上搜索了很多文章,一直不是太明白;今天我来记录一下自己对Git的学习,如果对其他童鞋有所帮助,我荣幸之至! 一、Git 简析 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)。…

Git原理详解与实用指南

文章目录 上手 1&#xff1a;新公司用 Git 管理代码&#xff0c;怎么快速上手&#xff1f;上手2&#xff1a;团队工作的基本工作模型进阶1&#xff1a;HEAD、master与branch进阶2&#xff1a;push的本质进阶3&#xff1a;merge&#xff1a;合并commits进阶4&#xff1a;Feature…

最详细的Git原理总结+如何解决冲突

原文路径是https://www.cnblogs.com/cb0327/p/5066685.html 目录 1.提交 代码到远程仓库2.将远程仓库代码更新到本地3.更新到本地仓库时&#xff0c; 出现冲突&#xff0c;解决冲突后记&#xff1a; 正文 本文背景&#xff0c;在实际项目中使用git已有一年&#xff0c;发现不少…

图解git工作原理

git 是一个能处理各种大小项目的开源版本控制系统&#xff0c;本文想通过两张图来简单说明git的工作原理 从上图可以知道git分四个部分来记录文件状态 working directory:工作区&#xff0c;开发者直接修改的本地代码树 staging area&#xff1a;暂存区&#xff0c;用于临时保存…

git原理解释

工作区域 Git本地有三个工作区域&#xff1a;工作目录&#xff08;Working Directory&#xff09;、暂存区&#xff08;Stage/Index&#xff09;、本地仓库&#xff08;Repository或Git Directory&#xff09;。如果在加上远程的Git仓库&#xff08;Remote Directory&#xff0…

git的基本原理

刚刚接触到git和github&#xff0c;整理一部分相关原理帮助自己理解git命令和本地-远程的操作。 我们将这部分学习分为三部分&#xff1a;&#xff08;1&#xff09;本地仓库相关操作&#xff08;2&#xff09;远程仓库相关操作&#xff08;3&#xff09;本地-远程交互操作 本地…

Git原理及操作简介

Git原理及操作简介 一、Git是什么 Git是目前世界上最先进的分布式版本控制系统 工作原理 / 流程: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 二、SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中…

Git 工作原理

Git 工作原理 GIt简介Git 的基本原理Git的目录结构Git对象在之前我们提到过&#xff0c;Git是一套内容寻址&#xff08;content-addressable&#xff09;文件系统&#xff0c;那么Git是怎么进行寻址呢&#xff1f;Git对象的类型包括&#xff1a;BLOB、tree对象、commit对象。 对…

一文搞明白GIT——Git原理解析与常用命令

工作中经常用git&#xff0c;但是不少命令经常使用出现各种各样的问题&#xff0c;也不太理解其中的原理。今天专门总结一下git的原理&#xff0c;理解原理之后想实现什么样的功能直接找相应的命令即可。如有错误和不足&#xff0c;欢迎指正&#xff01; 一、 工作区 使用git…

Git 原理详解及实用指南

Git 原理详解及实用指南 什么是版本控制系统&#xff08;VCS&#xff09; 很多人认为 Git 难以理解的第一个门槛在于&#xff1a;所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚。其实分布式版本控制系统&#xff08;Distributed Version Control System - …

图解git原理

用了这么久git&#xff0c;你有没有想过git的原理是什么&#xff1f;为什么git做回退这么快&#xff1f;创建、切换分支也这么快&#xff1f;git的工作区、暂存区、本地仓库、远程仓库都分别对应怎样的实体&#xff1f;打开一个git仓&#xff0c;看看目录下的.git文件夹&#x…

Git 的原理

文章目录 什么是 Git&#xff1f;版本库是由什么构成的版本库&#xff08;项目文件夹&#xff09;的构成版本库&#xff08;对象数据库&#xff09;的结构提交的组成SHA1 算法 总结 暂存区什么样的文件&#xff0c;不应该上传到版本库中&#xff1f;查看暂存区清空暂存区选择性…

Git学习之git原理

git对象 当我们使用git进行版本管理时&#xff0c;git会将我们的文件和目录结构转化成git方便操作的数据(git对象)&#xff0c;然后再对这些git对象进行管理&#xff0c;从而实现版本管理的目的&#xff0c;这些git对象存放在git的对象库中。 我们眼中的文件会被git转化成&qu…