Git 暂存区机制详解

一、引言

git init 执行后发生了什么我们知道,Git 经过初始化后,会形成三个主要区域:工作目录(Working Directory)、暂存区(Staging Area)和版本库(Repository):

  • **工作目录(Working Directory)**是在计算机上实际工作的目录,其中包含了项目文件。当对项目文件进行修改时,这些修改只存在于工作目录中,并没有被Git跟踪。
  • **暂存区(Staging Area)**是位于Git仓库内部的一个中间区域。它相当于一个缓冲区,用于存储想要提交到版本库的修改。当对项目文件进行修改后,需要将这些修改添加到暂存区,以便在下一次提交时包含这些修改。
  • **版本库(Repository)**是Git的核心部分,它保存了项目的完整历史记录。版本库由一系列的提交(Commits)组成,每个提交代表一个特定时间点上的项目状态。当执行提交操作时,Git会将暂存区中的内容创建为一个新的提交,并将其添加到版本库中。

使用 Git 的工作流程是:先将文件放入工作目录中,然后使用 git add <文件名>命令将该文件添加到暂存区,接着使用 git commit提交到版本库中 。
下面就具体看看暂存区的机制和原理吧

二、Git暂存区的定义和操作

Git的暂存区(Staging Area)是位于Git仓库内部的一个中间区域,也就是版本库 .git 目录下的 index 文件。暂存区的含义是,在对项目文件进行修改后,这些修改并不会立即被提交到版本库中。相反,你需要将这些修改先添加到暂存区,然后才能将其作为一个整体提交到版本库中。

2.1 如何将修改的文件添加到暂存区

要将修改的文件添加到Git的暂存区中,可以使用 git add <文件名> 命令,我们可以利用 git ls-file 查看index文件中的内容,判断文件是否添加到暂存区中。

//创建一个testIndex.txt文件
$ echo "test index" > testIndex.txt
//先查看暂存区中的文件,目前有一个文件和文件夹,没有testIndex.txt文件
$ git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       lib/readme2.txt
100644 b0530c9b7360a8cea0e4af86475cac70a2985138 0       readme.txt
//使用git add命令后,再次查看暂存区,发现
$ git add testIndex.txt
$ git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       lib/readme2.txt
100644 b0530c9b7360a8cea0e4af86475cac70a2985138 0       readme.txt
100644 b86453316b1e4fb7bd6974d9dc0ff029a4e60f48 0       testIndex.txt

这个命令将指定的文件添加到暂存区中,准备将其包含在下一次提交中。也可以使用通配符来匹配多个文件。比如想添加所有修改的文件到暂存区,可以使用 git add . 命令,这将添加当前目录下的所有修改的文件到暂存区中。

上面输出的内容我们在下面讲解 Index 文件内部内容后再讲解
另外,如果你想要交互式地选择要添加到暂存区的文件,可以使用以下命令 git add -i,此时进入交互式的模式,让你逐个选择要添加的文件。你可以根据提示进行操作,选择要添加的文件并确认操作:
image.png

2.2 Git 命令如何影响工作目录和暂存区

.git/index文件实际上就是一个包含文件索引的目录树,记录文件名和文件的状态信息,文件具体的内容存储在 Git 对象库,也就是 .git/objects目录中,如下图所示:
image.png

  1. git add <文件名>:将指定文件从工作区添加到暂存区。暂存区的目录树将会被更新,文件内容会被写入到对象库中的一个新对象中,该对象的 ID 将会被记录在暂存区也就是 Index 文件中。
  2. git restore --staged <文件名>:将指定文件或修改从暂存区移除,但保留在工作区中。这个命令会撤销之前使用 git add 命令添加到暂存区的文件或修改。
  3. git checkout -- <文件名>:撤销对指定文件的修改,将其恢复到最近一次提交的状态。这个命令会影响工作区中的文件,但不会改变暂存区。
  4. git checkout HEAD : 会用 HEAD 指向的 master 分支中的全部文件替换暂存区和工作区的文件
  5. git reset HEAD <文件名>:将指定文件从暂存区移除,但保留在工作区中。这个命令可以用于撤销之前使用git add命令添加到暂存区的文件。
  6. git commit:将暂存区的内容作为一个整体提交到版本库中。这个命令会将暂存区中的文件和修改保存到版本库中,不会直接影响工作区和暂存区。master 最新指向的目录树就是提交时原暂存区的目录树。
  7. git rm --cached <文件名>: 直接将暂存区的该文件删除,工作区则不做出改变

2.3 Git暂存区的优势和应用场景

  1. 分离工作目录和版本库:工作目录是你实际工作的地方,你可以在其中进行任意修改和调整。但并不是所有的修改都应该立即提交到版本库中。通过使用暂存区,你可以将对工作目录的修改与版本库的提交操作分离开来,从而更好地管理你的项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归思君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值