前文回顾

​查看提交历史​

git log

GIT的工作流程_git

提交历史有很多的提交记录
每一个提交记录都有一个提交ID

GIT的工作流程_git_02

​查看某一个ID的提交内容​

git cat-file -p 64142844bdfc78e7c734b564abccf2f8be6f6bc7

GIT的工作流程_工作区_03

每一个提交记录其实是一个tree对象
每次提交会包含多个文件或文件夹
每个文件夹是一个tree对象
每个文件是一个blob对象
文件夹中有多个文件即一个tree对象里面包含多个blob对象

GIT的工作流程_暂存区_04

​查看这次提交包含的内容​

git ls-tree 4b5fc5cd305e894714c1ebaac4593d48b6a1646d

GIT的工作流程_git_05

​查看blob文件内容​

git cat-file -p 5a78f48c31aebeef0bbdd0de26d809f1480f14ec

GIT的工作流程_git_06

​每一个文件夹其实是一个树状结构​

GIT的工作流程_工作区_07GIT的工作流程_git_08GIT的工作流程_工作区_09

这棵树上的每个节点都会包含这几部分
ID(tree有tree id,blob有blob id)(ID也就是对象的hash值)、
每个文件的实际数据
ID值会存储在暂存区
文件的实际数据会存储在提交历史中
ID值作为索引会指向实际存储的数据

GIT的工作流程_git_10

​查看index文件​

git ls-files --stage

GIT的工作流程_暂存区_11

​查看某个索引内容​

git cat-file -p a9be3f671e3bba97db9b42e808c86e9c5f7a189d

GIT的工作流程_git_12

​查看blob对象目录​

tree .git/objects -L 2

GIT的工作流程_git_13

​查看所有的分支文件​

cd .git/refs/heads/

GIT的工作流程_暂存区_14

​查看git分支对应的提交ID​

GIT的工作流程_暂存区_15

这个提交ID是一个指向某一系列提交之首的指针或引用

​HEAD指向最近的一次提交​

HEAD 文件通常是一个符号引用
指向目前所在的分支
所谓符号引用,表示它是一个指向其他引用的引用

cat .git/HEAD

GIT的工作流程_暂存区_16

​「分离 HEAD」状态即不再指向分支引用​

当检出一个标签、提交 
HEAD文件就会包含一个git对象的SHA-1值
仓库就变成了 「分离 HEAD」状态时

git checkout 5edc729711acde4a2647730a2af54f5a1fd36bc6

GIT的工作流程_暂存区_17

GIT工作流程

​一个新目录里面有一个README文件​

GIT的工作流程_暂存区_18

​目前暂存区和提交历史都是空的​

GIT的工作流程_暂存区_19

​提交该文件​

git add .

首先需要通过 git add 将其添加到暂存区
此时 Git 将在 .git/objects 目录中以该文件的内容生成一个 blob 对象
并将 blob 对象的信息添加到 .git/index 文件中

GIT的工作流程_git_20

​git commit​

GIT的工作流程_git_21

会取得暂存区中的内容生成一个 tree 对象
该 tree 对象即为工作区文件的永久快照
然后创建一个指向该 tree 对象的提交对象
最后更新 master 指向本次提交

​编辑了文件​

GIT的工作流程_工作区_22

假如在工作区编辑了文件
Git 会将其与暂存区现有文件快照进行比较
在 git add 了更改的文件后
根据文件当前内容生成新的 blob 对象并更新 .git/index 文件中的引用 ID
git commit 的过程与之前类似
但是新的提交对象会以 HEAD 引用指向的提交作为父提交
然后更新其引用的 master 指向新创建的提交

​git checkout​

git checkout 一个分支或提交时
它会修改 HEAD 指向新的分支引用或提交
将暂存区填充为该次提交的文件快照
然后将暂存区的内容解包复制到工作区中