GIT由三个部分组成

GIT的组成部分_git

  • 工作区
存放当前操作文件的本地文件系统目录
a、在工作区可随意添加或编辑文件
  • 暂存区
b、将修改后的文件添加到暂存区
  • 提交历史
c、并记录到提交历史

工作区

GIT的组成部分_暂存区_02

Git 可以把工作区中的文件处理压缩成一个提交对象
也能将取得的提交对象解包成文件同步到工作区中

暂存区

GIT的组成部分_暂存区_03

a、在工作区可能会同时更改多个完全不相干的文件
b、将它们分别放入暂存区
c、在不同的提交中加入提交历史
d、暂存区还用于合并冲突时存放文件的不同版本

GIT的组成部分_暂存区_04

a、刚初始化的Git仓库 暂存区是空的
b、然后会填充最近一次提交所对应的文件快照

​git status​

GIT的组成部分_git_05

将工作区的文件与暂存区的文件快照进行对比
并提示我们有哪些做了修改的文件尚未加入暂存区

​不同的区对应不同的实体​

GIT的组成部分_暂存区_06

a、工作区有可见的文件系统目录
b、暂存区的实体是位于 .git 目录的 index 文件
c、提交历史通过 .git/objects 目录保存着所有提交对象

​Index 文件​

GIT的组成部分_git_07

index 是一个二进制文件
包含着一个由路径名称、权限和
blob 对象的 SHA-1 值组成的有序列表

​元数据​

包含
a、每个文件的创建时间
b、最后修改时间等元数据
c、指向实际的数据对象的引用
d、保存了一份完整的文件快照
因此可以通过对比SHA-1校验和
实现与工作区文件之间的快速比较

​查看index中的内容​

git ls-files --stage

GIT的组成部分_工作区_08

包含
a、暂存区文件的路径名称
b、SHA-1 ID

GIT的组成部分_git_09

文件内容已经作为 blob 对象保存到了 .git/objects 目录中

​查看.git/objects目录​

tree .git/objects -L 2

GIT的组成部分_git_10

​blob 对象​

GIT的组成部分_暂存区_11

blob 对象是 Git 用来保存文件数据的二进制对象
可以通过 ID 取得对应的 blob 对象

​通过ID查看对象内容​

 git cat-file -p adc335f5acd0ef124dbdccef5060f5f01113a5dc

GIT的组成部分_git_12GIT的组成部分_git_13

将一个修改过的文件加入暂存区后
如果又在工作区对文件进行了新的修改
需要重新将其加入暂存区

提交历史

GIT的组成部分_工作区_14

提交历史是工作区文件在不同时间的文件快照

快照即文件或文件夹在特定时间点的状态
包括内容和元信息

​查看当前分支的提交历史​

git log

GIT的组成部分_git_15GIT的组成部分_git_16

a、Git 通过「提交对象」来储存每一次提交
b、对对象内容进行 SHA-1 计算得到的哈希值即ID
不同的内容一定会得到不同的结果
c、Git 既把ID作为每一个对象(不仅仅是提交对象)的唯一标识符
d、也用作 .git/objects 目录中的地址(其中存储着实际的二进制文件)

​通过id找对象并打印内容​

git cat-file -p f6ff29325167718c5eafb6fb1c10aea721b2fd12

GIT的组成部分_暂存区_17

​提交对象的内容包含​

  • 对应的 tree 对象的 ID
  • 父提交对象的 ID
  • 作者、提交者及提交信息等元信息

​tree 对象​

git ls-tree  f6ff29325167718c5eafb6fb1c10aea721b2fd12

GIT的组成部分_git_18

主要由其他tree对象和blob对象的ID、路径名称组成

GIT的组成部分_git_19

一个 tree 对象即可表示整个工作区中所有已提交目录及文件的内容

GIT的组成部分_工作区_20

提交历史中的每一个提交都包含着一份完整的某一时刻的文件快照
并通过保存上一次提交的引用形成连续的文件快照历史