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

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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
3.1 Git的特点: - 分布式版本控制系统:与集中式版本控制系统(如SVN)不同,Git不依赖于中央服务器,每个开发者都可以在本地进行版本控制。 - 快速高效:Git采用了多种优化策略,使得Git能够在处理大量数据时保持高效率。 - 强大的分支管理:Git的分支管理非常出色,支持快速创建、合并、删除分支等操作。 - 安全性高:Git采用了SHA1算法来对文件内容进行哈希,保证了数据的完整性和安全性。 - 可定制性强:Git的各种配置选项和扩展插件可以满足不同开发者的需求。 3.2 Git的基本操作: - 初始化库: git init - 添加文件到git add <file> - 提交文件到库: git commit -m "commit message" - 查看文件状态: git status - 查看提交历史: git log - 撤销工作的修改: git checkout -- <file> - 撤销的修改: git reset HEAD <file> - 撤销提交: git reset HEAD^ - 回滚到指定版本: git reset <commit> - 拉取远程库代码: git pull - 推送本地代码到远程库: git push 3.3 Git的分支管理: - 创建分支: git branch <branch_name> - 切换分支: git checkout <branch_name> - 合并分支: git merge <branch_name> - 删除分支: git branch -d <branch_name> 3.4 Git的协同工作: 多人协作开发时,常用的Git协作方式有: - fork+pull request:每个开发者将远程库fork到自己的账户下,进行开发后发起pull request请求,由项目负责人进行审核合并。 - 共享库+分支管理:多个开发者共同使用一个远程库,每个开发者在自己的分支上进行开发,最后由项目负责人进行分支合并。 - GitLab/GitHub等平台:利用Git平台提供的协作工具,多人进行协作开发和版本控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值