Git学习(三)——staging area 工作原理

这一次的内容整理自极客学院

相关概念解释:

  • git中包含的对象有四种:tag、commit、tree和blob对象,四者之间的关系如下图所示:
    Git学习(三)——staging area 工作原理_第1张图片
  • git由三个部分组成:分别是working directorystaging areahistory repository
  • working directory是文件增删修改的地方,即实际操作的目录
  • git工作区是git项目下的.git文件夹,其中,/.git/objects目录下包含了git项目开发过程当中的所有对象,是一个对象库
  • staging area/.git/index文件,index文件是一个索引的集合,索引指向了对象库当中由working directory文件(注意 git在意的是文件的内容)生成的blob对象,其中每个索引还保存了tree对象的相关信息,所谓的tree对象的即每个文件的目录结构
  • history repository,git commit之后记录的归档

工作原理

第一次commit

Git学习(三)——staging area 工作原理_第2张图片
- 涉及的命令:

mkdir gitTest
cd gitTest
mkdir folder1 
touch ./folder1/file1.txt file2.txt
#向文本文件中写入内容
git add file1.txt file2.txt
git commit -m 'first commit in master branch'
  • 过程:
    1. 通过git init创建一个master分支,并在working directory中创建相关文件和目录结构
    2. git add指令第一次提交的时候生成了index文件,同时对象库中生成了两个blob对象,index中包含了指向两个对象的索引以及之后要生成的tree对象的相关信息
    3. git commit指令执行过后,根据staging area中的tree对象信息会在对象库中生成两个tree对象和一个commit对象,tree对象指向blob对象,commit对象执行顶层的tree对象,并且HEAD指针指向commit对象

第x次commit

  • 如果之后的提交没有修改之前的文件内容,其过程和第一次提交的原理是一样的
  • 如果修改了之前的文件内容,其过程如下:
    Git学习(三)——staging area 工作原理_第3张图片
    -过程:
    1. git对象是根据文件内容生成的,因此,当修改了file2.txt的时候,并且add之后,git对象库生成新的对象,index文件中也生成新的索引,并且重新计算tree对象的相关信息
    2. commit执行后,生成新的tree对象,tree对象指向新的blob对象以及以前部分未改变内容的blob对象或是tree对象,同时commit对象指向新的tree对象,HEAD指针也发生移动,指向新的commit对象。

仍然存在的问题

  1. history repository的准确描述

你可能感兴趣的:(Git)