本页的主要内容均转自其它博客,并结合个人经验进行了优化,仅供记录之用
本文介绍 Git 中工作区、暂存区和版本库之间的关系。
基本概念
Git 的主要工作环境有以下三种:
- 工作区:使用 Git 控制的主要内容,版本管理的主要对象;
- 暂存区:
.git
中的index
文件,因此也被称为索引; - 版本库:
.git
文件夹,默认隐藏,用于存放控制工作区版本的 Git 文件。
三者之间的关系如图所示:
工作区与版本库在空间上占据了整个工作目录,在时间上交替工作。
HEAD
( /.git/HEAD
)为指向当前版本的可变指针,通过控制其指向来控制使用的版本。
objects
( /.git/objects/
)为 Git 的对象库,包含了其创建的各种对象及内容。
基本操作
- 执行新增(或修改)操作
git add
时,暂存区的目录树会被更新,同时工作区新增(或修改)的文件内容会被写入到对象库中的一个新的对象中,而该对象的 ID 被记录在暂存区的文件索引中。该命令通常会以带有参数的git add <file>
或git add .
命令来增加指定文件或全部文件到目录树中。 - 执行提交操作
git commit
时,暂存区的目录树会写入到版本库(对象库)中,HEAD
指向的分支会做相应的更新。即HEAD
指向的分支的目录树就是提交时暂存区的目录树。 - 执行撤销操作
git reset HEAD
时,暂存区的目录树会被重写,覆盖内容为HEAD
指向的分支的目录树。
该操作不影响工作区
- 执行删除操作
git rm --cached
时,会从暂存区删除文件,文件名通过附带参数<file>
指定,整体命令形式为git rm --cached <file>
。
该操作不影响工作区
- 执行回滚操作
git checkout .
或git checkout <file>
时,会将暂存区全部或指定的文件替换工作区的文件。
该操作具有危险性,因为会清除工作区中未添加到暂存区中的改动
- 执行切换操作
git checkout HEAD .
或git checkout <file>
时,会用HEAD
指向的分支中的全部或指定文件替换暂存区和工作区的文件。
该操作极具危险性,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动
上述命令中的 <file>
可以是单个文件,也可以是多个文件。指定多个文件的方式为用空格隔开,即 <file1> <file2> <...>
。