当前位置: 首页 > 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.dtcms.com/a/329141.html

相关文章:

  • PG靶机 - Pelican
  • 【龙泽科技】汽车故障诊断仿真教学软件【科鲁兹】
  • (vue)el-table动态合并最后一行且内容靠左
  • CSS 多列布局(Multi-column Layout):快速上手指南
  • 基于UniApp的智能在线客服系统前端设计与实现
  • AI驱动的前端革命:10项颠覆性技术如何在LibreChat中融为一体
  • 3.9开发前端常用的几个工具(nvm,json-server,nrm)
  • vue实现模拟 ai 对话功能
  • C++QT HTTP与HTTPS的使用方式
  • Vue3从入门到精通:4.1 Vue Router 4深度解析与实战应用
  • 当GitHub宕机时,我们如何保持高效协作?分布式策略与应急方案详解
  • 将C#/.net项目附加到进程中
  • mac下载maven并配置,以及idea配置
  • 为什么要使用消息队列呢?
  • tlias智能学习辅助系统--Maven高级-聚合
  • 解决麒麟桌面系统时间不同步问题
  • Linux ARM64 内核解读之内核引导和初始化
  • 算法详细讲解 - 离散化/区间合并
  • AI编程:python测试MQ消息服务联接和消息接收
  • SimD小目标样本分配方法
  • 什么是HTTP的无状态(举例详解)
  • JavaScript 中 let、var、const 的区别详解
  • 如何用外部电脑访问本地网页?
  • Leetcode题解:215,数组中的第k个最大元素,如何使用快速算法解决!
  • 6 ABP 框架中的事件总线与分布式事件
  • 豆包 + 蘑兔 AI:圆你创作歌曲梦​
  • JavaWeb-Servlet基础
  • 4.0 vue3简介
  • 【深入浅出STM32(1)】 GPIO 深度解析:引脚特性、工作模式、速度选型及上下拉电阻详解
  • 【Docker项目实战】使用Docker部署todo任务管理器