Git 是一个分布式版本控制系统, Git 的操作大部分都是在本地进行的。每个 Git 项目的根目录下有一个 .git
目录,它是 Git 默默进行版本控制时读写的“数据库”。有几个概念需要提一下:
- 工作区:代码所在目录;
- 暂存区:
.git/index
文件; - 本地仓库:
.git
目录;
一个典型的工作流程如下图,绿色部分为工作区(Working Directory),对它进行任何修改(包括:新建文件、删除文件、文件重命名等)都和单纯的修改文件一样,不会涉及到版本控制。
只有当你把工作区的修改提交(commit)到仓库(.git
目录)中,Git 才会真正的进行版本控制。
暂存区是一个包含文件索引的目录树(.git/index
文件),记录了文件的元数据(文件名、文件长度、修改时间等),而文件内容则存放在 .git/objects
目录下。
用 Git 进行版本控制,实际上就是在工作区、暂存区、仓库三个地方进行文件信息的记录。
Git 将提交(commit)、文件、目录统统视为对象。对象以 SHA1
值作为指纹,与其他对象相区分。Git 命令操作的最小单位是对象。 Git 会将文件的副本存放在 .git
文件夹下,每个文件都根据文件内容进行操作。以下图为例:
98ca9
对象是一次提交,它记录了本次提交的元信息以及92ec2
树对象;92ec2
树对象记录了文件名和对象的印射关系;- 本次提交修改的三个文件一一对应了一个对象;
Git 项目的文件始终在四种状态之间迁移,如下图所示:
1.创建一个新文件 foo.txt
,此时它处于未跟踪(Untracked)的状态,未被 Git 进行版本控制;
2.通过 add
命令将它纳入 Git 管理,此时 foo.txt
变为已暂存(Staged)状态;
3.提交此次操作,foo.txt
转变为未修改(Unmodified)状态;
如果是修改文件,典型的操作流程如下:
-
修改
foo.txt
文件,它转变为已修改(Modified)状态 -
通过
add
命令将它的修改记录到暂存区,为已暂存(Staged)状态;
-
提交此次操作,
foo.txt
转变为未修改(Unmodified)状态;
如果是删除文件,典型的操作流程如下:
-
删除
foo.txt
文件,它转变为已修改(Modified)状态; -
通过
add
命令将操作记录到暂存区,为已暂存(Staged)状态; -
提交此次操作,
foo.txt
转变为未修改(Unmodified)状态(文件历史版本依然在.git
中被记录着);