git 中的概念

git 中的概念

在使用 Git 版本控制的过程中,有些概念我们必须有所了解,这样才能更有效率也更有意义的学下去。

有清楚且正确的概念认知,不但有助于我们学习如何操作 Git 命令,更重要的是,学习 Git 的相关知识也会更加容易上手。

本文的一些概念都是使用英文为主,这是因为在不同文章里可能会存在一些翻译问题,会导致大家有一些理解误差。

repository

我们更多的将其翻译为「仓库」, 我们要使用 Git 进行版本控制,很自然的,我们需要一个「仓库」来储存这些版本信息,这个仓库其实就是用来储存所有版本的一个空间或一个文件夹与一堆文件。

如果有了解过 Git 的人,应该很清楚,建立仓库有很多方法,如果我们要在任意一个文件夹里建立一个 Git 仓库,只要输入以下命令就可以建立完成:

git init

在这里插入图片描述

从上图可以看到,我们在执行了 git init 命令后在 demo 目录下创建了 .git 目录,这个文件夹就是一个 Git 仓库,未来所有版本的变更,都会自动储存在这个文件夹里面。

在这里插入图片描述

working directory

「工作目录」

在上面我们执行了 git init 命令后,这个 demo 文件夹就会自动成为我们的「工作目录」。

所谓「工作目录」的意思,就是我们正在准备开发的项目文件,未来都会在这个目录下进行编辑,无论是新增文件、修改文件、删除文件、文件更名以及所有其他 Git 相关的操作,都会在这个目录下完成,所以才称为「工作目录」。

由于在使用 Git 版本控制时,会遭遇到很多分支的状況,所以「工作目录」很有可能会在不同的分支之间进行切换,有些 Git 命令在执行的时候,会一并更新「工作目录」下的文件。例如当我们使用 git checkout 切换到不同分支时,由于目前分支与想要切换过去的分支的目录结构不太一样,所以很有可能会将我们目前「工作目录」下的文件进行更新,好让目前的「工作目录」下的这些目录与文件,都与另一个要切换过去的分支下的目录与文件一样。

所以,适时的保持「工作目录」的干净,是版本控制过程中的一个基本原则,更尤其是日后要进行合并的时候,这点尤其重要。

staging area

「暂存区」,由于在 git 仓库中「暂存区」其实是一个名为 index 的文件( .git/index ),所以也会被叫做「索引」。

「工作目录」下的每一个文件都只有一种状态:已跟踪未跟踪

已跟踪的文件是指那些被纳入了版本控制的文件,「工作目录」中除已跟踪文件外的其它所有文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有被放入「暂存区」。简而言之,已跟踪的文件就是 Git 已经知道的文件。

在「工作目录」中新增一个文件,这个文件就是未追踪的。

比如我们在「工作目录」中新增一个 index.js 文件,然后通过 git status 查看状态

在这里插入图片描述
这里提示了「工作目录」里存在一个未追踪的文件 index.js.

此时我们可以通过 git add index.js 把 index.js 文件添加进「暂存区」中,在运行 git status 命令,会看到 index.js 文件已被追踪,并处于暂存状态:

在这里插入图片描述

只要在 Changes to be committed 这行下面的,就说明是已暂存状态。 如果此时执行 git commit 命令,那么该文件在我们执行 git add 时的版本将被留存在后续的历史记录中。

修改 index.js 文件的内容后我们再执行 git status 看看状态。

在这里插入图片描述

index.js 文件出现在「暂存区」和非暂存区了,这是因为我们执行 git add 命令后只是把当前版本(文件内容变更后都属于一个新版本)添加进「暂存区」。

如果我们执行 git commit 命令把版本提交出去,版本库中 index.js 的版本就是我们最后一次执行 git add 命令时的那个版本,而不是当前「工作目录」中最新的版本。所以,运行了 git add 之后又作了更改的文件,需要重新运行 git add 把最新版本重新暂存起来。

上图中文件 index.js 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到「暂存区」。 要暂存这次更新,就需要再次运行 git add 命令。

「暂存区」的目的主要用来记录「有哪些文件即将要被提交到下一个 commit 版本中」。如果我们想把某个版本提交到 Git 仓库里,那么我们首先就要把这个文件放入「暂存区」中,之后才能将这个变更版本提交出去。

对于已追踪的文件,在工作一段时间后,它们的状态可能是 unmodified、modified 或 staged。

  • unmodified:未修改的,代表文件第一次被加入,或是文件内容与最后一次 commit 的版本一致的状态。
  • modified:已修改的,代表文件已经被编辑过,或是文件内容与最后一次 commit 的版本不一致的状态。
  • staged:等待被 commit 的,代表下次执行 git commit 会将这些文件全部纳入版本库。

git add 命令

git add 命令,是为了将目前「工作目录」的变更写入到「暂存区」里。

使用 git add -u 则可以仅将「更新」或「删除」的文件变更写入到「暂存区」中。

git add 命令是一个多功能命令,可以:

  • 开始追踪新文件
  • 把修改后的已追踪文件放到「暂存区」
  • 用于合并时把有冲突的文件标记为已解决状态等

git status 命令

主要用来获取 「工作目录」中的文件的最新版本与「暂存区」中的差异。

这些差异中一共有三种不同的分组:

  • Changes to be committed (准备提交的变更):通过 git add 命令添加到「暂存区」中但是暂时未被提交到版本库中的文件
    • 新文件:版本库中不存在该文件,但是「暂存区」存在该文件,前面会有一个 new file 的提示
    • 修改后的文件:版本库中存在该文件,但是版本库中的最新版本与「暂存区」版本不一致,前面会有一个 modified 的提示。
    • 在执行 git commit 后这些文件都会被提交到版本库中。
  • Changes not staged for commit (尚未准备提交的变更):暂时未通过 git add 命令将变更版本放入「暂存区」的文件
    • 修改后的文件:版本库或者「暂存区」中存在该文件,但是版本库或者「暂存区」中的最新版本与「工作目录」中的最新版本不一致,前面会有一个 modified 的提示。
    • 在执行 git commit 后这些变更文件并不会被添加到版本库中。
  • Untracked files (未追踪的变更):
    • 新文件:版本库中不存在,暂存区也不存在。
    • 在执行 git commit 后这些变更文件并不会被添加到版本库中。

objects

对象,Git 的对象分为以下四种类型:

  • 「blob 对象」:「暂存区」的具体文件内容
  • 「tree 对象」:包含「暂存区」的文件的文件夹名及对应的「blob 对象」
  • 「commit 对象」:提交的 commit 信息及 tree(root tree) 对象
  • 「tag 对象」:对应的 commit 对象的 hash 值

上面的几种类型不需要强行硬背,阅读完下面的部分想必大家都能轻易理解。

我们在执行 git init 后,.git/objects 文件夹里只存在 info、pack 两个空文件。

在这里插入图片描述

当我们在根目录下输出下面的命令创建一个 file1.txt 文件,并输入 hello git; 作为内容。

echo hello git; > file1.txt

然后执行 git add . 命令将 file1.txt 文件放入暂存区:

git add .

此时我们看看 objects 文件夹中多了个名为 76 的文件夹

在这里插入图片描述

该文件夹里的存在一个 31bcb57512d5989050a08d7c507c8db7eebf8f 文件

在这里插入图片描述

我们在通过 git add 命令将文件存入「暂存区」时,都会将文件的内容中取出,通过内容产生一组 SHA1 哈希值,然后依照这个 SHA1 哈希值命名一个文件并放入 objects 文件夹中。这个文件就是 「blob 对象」

Git 仓库中的每一个「对象」,都是以「文件内容」进行 SHA1 哈希运算出一个 hash 值,并用这个 hash 值当作对象的名称 (文件名)。我们以 7631bcb57512d5989050a08d7c507c8db7eebf8f 为例,Git 会先拿前两个字元(76)当作目录名,然后把剩下的 hash 值当成文件名 (31bcb57512d5989050a08d7c507c8db7eebf8f),这些对象的实体目录与文件也都是放在 .git\objects 目录下。

此时我们打开这个文件,可以发现里边是乱码,这是因为文件内容都是通过 zlib 算法进行压缩过的,这样不但可以有效的提升文件存取效率,在日后进行封装(pack)的时候也可以利用差异压缩(delta compression)演算法来节省空间。他会自动找出相似的 blobs,并自动计算出 blob 之间的变化差异,再将这些差异储存在一个名为 packfile 的文件中,这样就可以大幅节省磁盘空间的耗用)。

在这里插入图片描述

使用 node 解压

如果我们想读取里边的内容,可以使用 node 中的 zlib 库进行解压。

const zlib = require("zlib");
const fs = require("fs");
const path = require("path");const file = fs.readFileSync(path.resolve(__dirname, "./31bcb57512d5989050a08d7c507c8db7eebf8f"));
zlib.unzip(file, function (err, buffer) {if (!err) {console.log(buffer.toString());}
});

在这里插入图片描述

可以看到解压出来的内容并非原来的文本内容,而是多了 blob 12 这几个字符( Git 的处理),其中 blob 就是标识这个文件类型,12 就是文件的大小。

使用 git cat-file 指令读取

Git 也提供了一个命令来读取这些对象的内容:

git cat-file -p [hashname]

在这里插入图片描述
此时读取的文件内容是不包含类型及文件大小的,我们可以使用 -t 标识来读取这个文件对象类型:

在这里插入图片描述

使用 -s 标识来读取文件大小:

在这里插入图片描述

在把文件放入「暂存区」后,我们通过 commit 命令进行提交:

在这里插入图片描述

解析一下上面的信息:

  • master:当前 commit 的分支
  • root-commit:当前分支的首次 commit,第二次的 commit 会以此作为 parent 来构建链式 commit,实现版本回退。
  • bbada81:当前 commit 的 hash 值,我们可以通过这个 hash 来获取到对应 「commit 对象」的信息
  • 1st commit:当前 commit 的信息
  • 1 file changed, 1 insertion(+):当前 commit 版本与之前版本对比后的文件变动描述
  • create mode 10064 file1.txt:新增了一个 10064 权限的文件,文件名为 file1.txt。(10064就是 Git 内部的文件权限标识,代表普通文件,可读可写。)

执行了 commit 命令后在 objects 文件夹上新增了一个 bb 文件夹,这个文件里有两个文件。

在这里插入图片描述

通过上面的 commit 消息可以看到 bbada81 开头的就是「commit 对象」,也就是 ada81… 这个文件。

通过 git cat-file 看看这个文件对象类型及内容:

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

可以看到在「commit 对象」里存在以下信息:

  • tree bbb2b3dbc…: 这个就是「tree 对象」,我们可以把它理解成目录,用于 Git 在版本库里组织文件结构,这样就可以保证代码仓库里跟「工作目录」里的结构是一样的。
  • author:仓库作者信息
  • committer:当前 commit 的作者信息
  • 1st commit:当前 commit 的信息

在 objects 文件夹中也存在一个 bb/b2b3dbc… 文件。

通过 git cat-file 看看「tree 对象」类型及内容:

在这里插入图片描述
在这里插入图片描述
在上图中可以看到这个「tree 对象」里包含了一个「blob 对象」的索引以及文件名,这个「tree 对象」就相当于「工作目录」的根目录,根目录下存在一个 file1.txt 文件(也就是「blob 对象」),这样一个「commit 对象」其实就对应了当前提交的「工作目录」的版本。

为了更好的理解「tree 对象」,我们在「工作目录」创建一个 folder1 文件夹

执行 git status 查看状态时会发现提示 nothing to commit,这是因为 Git 是以文件内容进行对比的,文件夹并不会纳入对比。

在 folder1 文件夹下新建一个 file2.txt 文件,内容依旧是 hello git;。此时通过 git status 就可以看到 Git 检测到了「工作目录」存在未追踪的文件。

在这里插入图片描述
通过 git add . 把文件放入「暂存区」后,由于 file2.txt 与 file1.txt 的内容是相同的(hash 值也一样),因此在 objects 文件夹中并不会生成新的「blob 对象」,之后我们把文件提交出去。

在这里插入图片描述

此时在 objects 目录下生成了3个文件夹:02、55、c9(根据上图的 commit 信息可知,c9 文件夹里的 d4676… 文件就是「commit 对象」)。

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

解析一下上图中「commit 对象」:

  • tree 5505…:「tree 对象」,前面说过可以把它理解成一个目录,在这里我们把它认为是根目录,就是当前代码版本的根目录。
  • parent bbada…:记录上一次 commit 的 hash 值,这样就通过 git reset HEAD^ 回退到上一次的版本。

通过 cat-file 查看一下 5505… 这个「tree 对象」的内容:

在这里插入图片描述

里面有一个「blob 对象」hash值、名称,以及一个「tree 对象」hash值、名称,我们现在盲猜都可以知道 02fe… 这个「tree 对象」里边的内容就是 file2.txt 文件对应的「blob 对象」hash值、名称。

在这里插入图片描述

整理一下当前的「commit 对象」,可以看到跟我们「工作目录」的结构是一样的。

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

此时 objects 中各对象的引用关系如下图所示:

在这里插入图片描述

对于 blob、tree、commit 这三个对象,我们应该都非常理解了吧,还剩最后一个「tag 对象」,这个文件在 .git/refs/tag 文件夹中,文件名就是 tag 名,文件内容就是在生成 tag 时「commit 对象」的 hash 值。

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

这四个对象的关系如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Making Large Language Models Perform Better in Knowledge Graph Completion

Making Large Language Models Perform Better in Knowledge Graph Completion 基本信息 博客贡献人 鲁智深 作者 Yichi Zhang, Zhuo Chen, Wen Zhang, Huajun Chen 隶属于浙江大学计算机学院和软件学院 摘要 本文主要探讨了如何将有用的知识图谱结构信息融入大语言模型中…

获取ffmpeg转码的实时进度

文章目录 前言一、需求二、实现获取 ffmpeg 转码的实时进度1、思路梳理2、源码修改 三、运行结果 前言 本文记录查看 ffmpeg 进行转码时的实时进度。所用的工程基于上个博客编译成功的工程:使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c 一、需求 使用 ffmepg 对音…

AIGC ChatGPT 4 Prompt 万能提示词公式

最近大家都在使用ChatGPT来帮助自己完成相应的工作。很多时候大家提出的问题得不到很清晰,很明确的答案。 我们应该怎么样来和ChatGPT进行有效的沟通呢? 例如我们先来问一问ChatGPT: 要获得最准确的回复,请确保遵循以下建议: 明确性:请尽量明确描述您的问题。确保提供足…

Apache OFBiz groovy 远程代码执行漏洞(CVE-2023-51467)复现

Apache OFBiz groovy 远程代码执行漏洞&#xff0c;攻击者可构造请求绕过身份认证&#xff0c;利用后台相关接口功能执行groovy代码&#xff0c;导致远程代码执行。 1.漏洞级别 高危 2.漏洞搜索 fofa app"Apache_OFBiz"3.影响范围 Apache OFBiz < 18.12.104…

Talk|南洋理工大学王谭:DisCo-基于解耦控制的现实人物舞蹈生成及相关工作梳理

本期为TechBeat人工智能社区第563期线上Talk。 北京时间1月11日(周四)20:00&#xff0c;南洋理工大学博士生—王谭的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “DisCo-基于解耦控制的现实人物舞蹈生成及相关工作梳理”&#xff0c;介绍了他的团…

Kotlin程序设计(三)高级用法

Kotlin程序设计高级篇 在学习了前面的内容之后&#xff0c;相信各位小伙伴应该对Kotlin这门语言有了一些全新的认识&#xff0c;我们已经了解了大部分的基本内容&#xff0c;从本章开始&#xff0c;就是对我们之前所学的基本内容的进一步提升。 泛型 在前面我们学习了最重要…

JavaWeb,HTML的学习

关于HTML、CSS、JavaScript HTML主要用于网页主体结构的搭建 CSS主要用于页面元素美化 JavaScript主要用于页面元素的动态处理 关于HTML 关于超文本 关于标记语言 HTML基础结构 html文件是浏览器负责解析和展示。html文件是纯文本文件&#xff0c;普通编辑工具都可以编辑。…

经典文献阅读之--VoxFormer(基于Transformer的3D语义场景补全)

0. 简介 之前了解了很多BEV的相关操作&#xff0c;但是基本上要么是激光和视觉结合&#xff0c;要么是纯视觉完成的2D激光投影这两种&#xff0c;而那种3D Occupancy方法可以利用栅格的方法完成纯视觉占据栅格的生成。《VoxFormer: Sparse Voxel Transformer for Camera-based…

书生·浦语大模型实战营-学习笔记1

目录 书生浦语大模型全链路开源体系数据集预训练微调评测部署多智能体 视频地址&#xff1a; (1)书生浦语大模型全链路开源体系 开源工具github&#xff1a; https://github.com/InternLM/InternLM 书生浦语大模型全链路开源体系 这次视频中介绍了由上海人工智能实验室OpenMMLa…

LangChain 71 字符串评估器String Evaluation衡量在多样化数据上的性能和完整性

LangChain系列文章 LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 62 深入理解Lang…

010集:with as 代码块读写关闭文件—python基础入门实例

接009集&#xff1a; 读写文本文件的相关方法如下。 read &#xff08; size-1 &#xff09;&#xff1a;从文件中读取字符串&#xff0c; size 限制读取的字符数&#xff0c; si ze-1 指对读取的字符数没有限制。 readline &#xff08; size-1 &#xff09;&#xff1a;在…

react hooks 高德地图的应用

一、准备 1.登录控制台 登录 高德开放平台控制台&#xff0c;如果没有开发者账号&#xff0c;请 注册开发者。 2.创建 key 进入应用管理&#xff0c;创建新应用&#xff0c;新应用中添加 key&#xff0c;服务平台选择 Web端(JS API)。 3.获取 key 和密钥 创建成功后&#x…

四、C++内存管理

1 C/C内存分布 在学习C的内存管理方式之前&#xff0c;我们先来看一道有关C/C内存分布的题目&#xff1a; 阅读下面的代码&#xff0c;回答相关问题&#xff1a; #include <iostream> using namespace std; int globalVar 1; static int staticGlobalVar 1; int main…

【C++进阶06】红黑树图文详解及C++模拟实现红黑树

一、红黑树的概念及性质 1.1 红黑树的概念 AVL树用平衡因子让树达到高度平衡 红黑树可以认为是AVL树的改良 通过给每个节点标记颜色让树接近平衡 以减少树在插入节点的旋转 在每个结点新增一个存储位表示结点颜色 可以是Red或Black 通过对任何一条从根到叶子的路径上 各个结点…

PaddleSeg学习4——paddle模型使用TensorRT推理(c++)

paddle模型使用TensorRT推理 1 模型末端添加softmax和argmax算子2 paddle模型转onnx模型3 onnx模型转TensorRT模型3.1 安装TensorRT-8.5.3.13.2 使用 trtexec 将onnx模型编译优化导出为engine模型 4 TensorRT模型推理测试5 完整代码6 测试结果 1 模型末端添加softmax和argmax算…

2022 年全国职业院校技能大赛高职组云计算赛项试卷

【赛程名称】云计算赛项第一场-私有云 某企业拟使用OpenStack 搭建一个企业云平台&#xff0c;以实现资源池化弹性管理、企业应用集中管理、统一安全认证和授权等管理。 系统架构如图 1 所示&#xff0c;IP 地址规划如表 1 所示。 图 1 系统架构图 表 1 IP 地址规划 设备…

docker 利用特权模式逃逸并拿下主机

docker 利用特权模式逃逸并拿下主机 在溯源反制过程中&#xff0c;会经常遇到一些有趣的玩法&#xff0c;这里给大家分享一种docker在特权模式下逃逸&#xff0c;并拿下主机权限的玩法。 前言 在一次溯源反制过程中&#xff0c;发现了一个主机&#xff0c;经过资产收集之后&…

网站开发第一弹---HTML01

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;网站开发flask框架 &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现…

基于pytorch的循环神经网络情感分析系统

任务目标 基于给定数据集&#xff0c;进行数据预处理&#xff0c;搭建以LSTM为基本单元的模型&#xff0c;以Adam优化器对模型进行训练&#xff0c;使用训练后的模型进行预测并计算预测分类的准确率。 数据简介 IMDB数据集是一个对电影评论标注为正向评论与负向评论的数据集…

【AI视野·今日NLP 自然语言处理论文速览 第七十二期】Mon, 8 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 8 Jan 2024 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers DeepSeek LLM: Scaling Open-Source Language Models with Longtermism Authors DeepSeek AI Xiao Bi, Deli Ch…