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能够精确控制版本管理的过程,使开发者可以灵活地选择要提交的修改,而不是必须提交所有工作区的变更。
-
工作区是你直接编辑文件的地方
-
通过git add命令将修改从工作区添加到暂存区
-
通过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 种类型:
-
Blob 对象:存储文件内容(不包括文件名)。
-
Tree 对象:存储目录结构,记录文件名及其对应的 Blob 或子 Tree。
-
Commit 对象:存储提交信息,包括:
-
作者、提交者信息
-
提交时的 Tree 对象(代表当前项目的快照)
-
父提交(前一个 Commit 对象的 SHA-1)
-
-
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. objects
、master
和 HEAD
的关系
-
objects
存储所有数据(文件、目录、提交等)。 -
master
指向最新的 Commit 对象(即该分支的最新状态)。 -
HEAD
指向当前分支(如master
),从而间接指向最新的 Commit。
关系:HEAD -> master -> Commit -> Tree -> Blobs(键值对的关系,指针的关系)
-
HEAD
指向master
(当前分支)。 -
master
指向最新的Commit
。 -
Commit
指向Tree
(项目快照)。 -
Tree
指向Blob
(文件内容)。