一、引言
从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
,此时进入交互式的模式,让你逐个选择要添加的文件。你可以根据提示进行操作,选择要添加的文件并确认操作:
2.2 Git 命令如何影响工作目录和暂存区
.git/index
文件实际上就是一个包含文件索引的目录树,记录文件名和文件的状态信息,文件具体的内容存储在 Git 对象库,也就是 .git/objects
目录中,如下图所示:
git add <文件名>
:将指定文件从工作区添加到暂存区。暂存区的目录树将会被更新,文件内容会被写入到对象库中的一个新对象中,该对象的 ID 将会被记录在暂存区也就是 Index 文件中。git restore --staged <文件名>
:将指定文件或修改从暂存区移除,但保留在工作区中。这个命令会撤销之前使用git add
命令添加到暂存区的文件或修改。git checkout -- <文件名>
:撤销对指定文件的修改,将其恢复到最近一次提交的状态。这个命令会影响工作区中的文件,但不会改变暂存区。git checkout HEAD
: 会用 HEAD 指向的 master 分支中的全部文件替换暂存区和工作区的文件git reset HEAD <文件名>
:将指定文件从暂存区移除,但保留在工作区中。这个命令可以用于撤销之前使用git add命令添加到暂存区的文件。git commit
:将暂存区的内容作为一个整体提交到版本库中。这个命令会将暂存区中的文件和修改保存到版本库中,不会直接影响工作区和暂存区。master 最新指向的目录树就是提交时原暂存区的目录树。git rm --cached <文件名>
: 直接将暂存区的该文件删除,工作区则不做出改变
2.3 Git暂存区的优势和应用场景
- 分离工作目录和版本库:工作目录是你实际工作的地方,你可以在其中进行任意修改和调整。但并不是所有的修改都应该立即提交到版本库中。通过使用暂存区,你可以将对工作目录的修改与版本库的提交操作分离开来,从而更好地管理你的项目。