当前位置: 首页 > news >正文

Git核心机制:工作区、暂存区与版本库

目录

一、Git 工作区、暂存区和版本库

1、工作区(Working Directory)

2、暂存区(Staging Area/Index)

3、版本库(Repository)

三者的关系

重要说明

二、Git 版本库中的 objects、master 和 HEAD 的关系(了解)

1. objects(对象数据库)

2. master(主分支)

3. HEAD(当前分支的指针)

4. objects、master 和 HEAD 的关系


一、Git 工作区、暂存区和版本库

1、工作区(Working Directory)

        工作区是你在电脑上进行代码编辑或文件操作的目录,也就是你日常直接看到的项目文件夹。所有新创建或修改的文件最初都存在于工作区中。

2、暂存区(Staging Area/Index)

暂存区是Git的一个重要概念,它充当工作区和版本库之间的缓冲区域:

  • 英文名为stage或index

  • 物理上存储在.git目录下的index文件中(.git/index)(若是刚创建的仓库,什么都还没操作就暂时没有index文件,直到使用git add命令提交文件到暂存区之后才会有)

  • 暂存区的主要作用是精确控制哪些修改将被包含到下一次提交中

  • 通过git add命令可以将工作区的修改添加到暂存区

3、版本库(Repository)

版本库(又称仓库)是Git用来存储项目历史记录的核心部分:

  • 工作区中的.git隐藏目录就是Git的版本库

  • 它记录了项目的完整历史,包括所有提交、分支、标签等信息

  • 版本库可以追踪每个文件的变更历史,允许你在任何时候回退到历史版本

三者的关系

        这个流程确保了Git能够精确控制版本管理的过程,使开发者可以灵活地选择要提交的修改,而不是必须提交所有工作区的变更。

  1. 工作区是你直接编辑文件的地方

  2. 通过git add命令将修改从工作区添加到暂存区

  3. 通过git commit命令将暂存区的内容永久保存到版本库

重要说明

  • 新创建或复制到工作区的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件,Git并不会自动跟踪

  • 必须通过git add和git commit命令才能将文件纳入版本控制

  • 在创建Git仓库时,Git会自动:

    • 创建一个默认的master/main分支

    • 创建一个HEAD指针指向当前分支

  • 提交操作(git commit)实际上是将暂存区的内容写入版本库,并创建一个新的提交对象


二、Git 版本库中的 objects、master 和 HEAD 的关系(了解)

        Git 的版本库(.git 目录)存储了项目的完整历史,其中最重要的组成部分包括 objects(对象数据库)、分支(如 master) 和 HEAD。它们之间的关系如下:

1. objects(对象数据库)

        Git 的核心是一个键值对数据库,所有数据(文件、目录、提交等)都存储在 .git/objects 目录下,每个对象都有一个唯一的 SHA-1 哈希值 作为文件名。
Git 对象主要分为 4 种类型:

  1. Blob 对象:存储文件内容(不包括文件名)。

  2. Tree 对象:存储目录结构,记录文件名及其对应的 Blob 或子 Tree。

  3. Commit 对象:存储提交信息,包括:

    • 作者、提交者信息

    • 提交时的 Tree 对象(代表当前项目的快照)

    • 父提交(前一个 Commit 对象的 SHA-1)

  4. Tag 对象(可选):用于标记特定的提交(如版本号 v1.0)。

示例:

2. master(主分支)

  • master(或 main)是 Git 默认创建的分支,代表项目的主线开发历史。

  • 它本质上是一个指针,指向某个 Commit 对象(即最新的提交)。

  • 存储在 .git/refs/heads/master 文件中,内容是该分支最新提交的 SHA-1 值。

示例:

$ cat .git/refs/heads/master
a1b2c3d4e5f6...  # 指向最新的 Commit 对象

3. HEAD(当前分支的指针)

  • HEAD 是一个特殊的指针,指向当前所在的分支(如 master)。

  • 它通常存储在 .git/HEAD 文件中,内容可能是:

    • 直接指向某个 Commit(detached HEAD 状态,如 git checkout a1b2c3)。

    • 或间接指向某个分支(如 ref: refs/heads/master)。

示例:

$ cat .git/HEAD
ref: refs/heads/master  # 表示当前在 master 分支

4. objectsmaster 和 HEAD 的关系

  1. objects 存储所有数据(文件、目录、提交等)。

  2. master 指向最新的 Commit 对象(即该分支的最新状态)。

  3. HEAD 指向当前分支(如 master,从而间接指向最新的 Commit。

关系:HEAD -> master -> Commit -> Tree -> Blobs(键值对的关系,指针的关系)

  • HEAD 指向 master(当前分支)。

  • master 指向最新的 Commit

  • Commit 指向 Tree(项目快照)。

  • Tree 指向 Blob(文件内容)。

http://www.xdnf.cn/news/1293553.html

相关文章:

  • PyTorch Tensor完全指南:深度学习数据操作的核心艺术
  • Windows基础概略——第一阶段
  • 锂电池自动化生产线:智能制造重塑能源产业格局
  • 全球AI安全防护迈入新阶段:F5推出全新AI驱动型应用AI安全解决方案
  • C语言——深入理解指针(三)
  • YOLOv11+TensorRT部署实战:从训练到超高速推理的全流程
  • TeamViewer 以数字化之力,赋能零售企业效率与客户体验双提升
  • ROS2实用工具
  • 前端工程师的技术成长路线图:从入门到专家
  • 黑盒测试:用户视角下的软件“体检”
  • 自动驾驶轨迹规划算法——Apollo EM Planner
  • C++QT HTTP与HTTPS的使用方式
  • Pytest项目_day14(参数化、数据驱动)
  • 基于SpringBoot+Vue的智能消费记账系统(AI问答、WebSocket即时通讯、Echarts图形化分析)
  • 挂糊:给食材穿层 “黄金保护衣”
  • 量子安全新纪元:F5发布全新AI驱动的全栈式后量子加密AI安全方案
  • 美团搜索推荐统一Agent之交互协议与多Agent协同
  • 【P21】OpenCV Python——RGB和BGR,HSV和HSL颜色空间,及VScode中报错问题解决
  • 408每日一题笔记 41-50
  • 车载软件架构 --- MCU刷写擦除相关疑问?
  • 前端css学习笔记4:常用样式设置
  • epoll模型解析
  • Socket 套接字的学习--UDP
  • 【H5】禁止IOS、安卓端长按的一些默认操作
  • java中在多线程的情况下安全的修改list
  • Win11和Mac设置环境变量
  • 一键自动化:Kickstart无人值守安装指南
  • [ Mybatis 多表关联查询 ] resultMap
  • 【SpringBoot系列-02】自动配置机制源码剖析
  • RabbitMQ面试精讲 Day 21:Spring AMQP核心组件详解