当前位置:   article > 正文

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓_git 工作区域(1)_git暂存区

git暂存区

3. Further Exploration 进一步探索

其实,在我们的电脑上,git 工作区是工作区、暂存区和本地仓的统称…现在我们用图文形式开始解释,以 Mac 电脑为例,Windows 基本思路一致。

3.1 Git Structure 文件结构

首先我们从 git 文件夹结构入手,比如我们创建了一个文件夹 learnGit 并且使用 git init 命令初始化成一个 git 文件夹,里面有一个 readme.txt 文件,那么 readme.txt 其实就处在该 git 文件夹的工作区,这点很好理解对吧。

此时如果我们在 learnGit 目录中使用 command + shift + . 快捷键 (显示隐藏文件),会出现一个 .git 文件夹,这就是我们所谓的本地版本库,它是 git 版本控制系统用于存储仓库元数据和对象的目录,更是 git 的核心。它包含了 git 仓库的全部信息,包括版本历史、分支、标签、配置等。

3.2 Key folder 隐藏文件 .git

.git 文件夹是Git版本库的核心,它使得Git能够追踪文件的更改、管理分支、记录提交历史等。这个文件夹通常位于项目的根目录下。在通常情况下,用户不太需要直接操作这个文件夹,而是通过Git命令来与版本库进行交互。为了更好地了解 git,一起来看看以下几个重要的文件及文件夹。

3.2.1 index 文件

没错,通过名字不难看出 index 文件实际上就存储了将被包含在下一次提交中的文件信息,我们可以理解为这就是 Staging Area 即暂存区的内容。这就是为什么说暂存区的内容其实也被包括在工作区。

3.2.2 HEAD 文件 (*)

指向当前所在分支的最新提交,当前表明我们在本地的 main 分支,如果我们切换到另一本地分支,比如 temp,那么这个 HEAD 文件就会显示 ref: refs/heads/temp (之后演示的内容原理都和 main 分支一样)。HEAD 文件的内容是一个路径文件,我们打开这个路径下的main文件 .git/refs/heads/main

显示为一段 hash 码,我们先不要关掉这个文件,等下看这个 hash 码和谁能对应上

3.2.3 logs 文件夹 (*)

由文件夹名字不难看出这是一个用于存放记录日志的目录,logs 文件夹下又包括一个 HEAD 以及 refs 文件夹,如下图所示

与上一个 HEAD 文件不同,这个 HEAD 文件在 logs 文件夹下,它主要记录的是 ‘HEAD’ 引用的变化,即当前所在的分支或提交的变化。可用于记录分支切换,版本回退,提交等日志。比如每次切换分支或提交时,都会在这个文件中生成一条记录,包括变化的时间、旧的 HEAD 引用的位置、新的 HEAD 引用的位置等信息。

refs 文件夹中包含 heads 和 remotes 两个文件夹,remotes 很明显是关于远程仓的,我们主要来看看 heads。heads 文件夹中包含一个 main 文件。这个文件是用于记录本地特定分支的引用变化,每次该分支发生变化时,都会在这个文件中生成一条记录,包括变化的时间、旧的分支位置、新的分支位置等信息。

我们用文本编辑器打开这个 .git/logs/refs/heads/main 文件

我们发现最后的 hash 码和之前那个对应上了!

.git/HEAD 指向的 .git/refs/heads/main 哈希码 == .git/logs/refs/heads/main 最后的哈希码

我们知道 HEAD 表示当前分支提交的最新版本,上面这个例子表示,我们目前所在的本地 main 分支上最新提交版本对应的 reference (快照) 是 ece57b94dd97a…5896 这个 Hash 码,由此我们得出结论,在获取历史提交版本时是以 commit 对应的 Hash 码作为依据找到对应的提交版本,这个 Hash 码在 .git/logs 日志中可以找到。

可是,有了 Hash 码还不够,我们还要根据这个 Hash 码找到具体的提交内容,那么具体的提交内容存放在哪呢?

3.2.4 objects 文件夹 (*)

objects 就是我们的本地对象库,它的作用是存储所有的 git 对象,如提交内容、树(目录)、Blob(文件)等。所以如果我们要依据 Hash 码找到实际的提交内容,就要拿着 logs 文件夹中存储的 Hash 码来 objects 文件夹取。在这个目录中,git 会根据哈希值的前两个字符将对象分组存储。每个提交对象的内容会被压缩、存储在一个以哈希值命名的文件中。如果对象内容有变化,git 会生成新的哈希值。

打开这个 ec 文件夹就能看到,我们最后一次提交的具体内容了,这个内容是以之前那个 Hash 码命名的。很巧的是,我们上一次的提交和最新的提交 Hash 码开头差不多,所以 git 通过计算前两位 hash 码将两者都放在了这个文件夹中。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/860920
推荐阅读
相关标签
  

闽ICP备14008679号