git 原理初探

前言

最近一直在研究 git 命令的操作效果,但总是感觉一知半解。自从看了知某平台文章这才是真正的Git——Git内部原理揭秘!,并结合git 图解,才感觉了解了一些 git 背后的故事。

因为 git 的命令和参数众多,初学者可以了解平常工作中经常用到的命令,并了解这个命令干了什么事,比起强行记住而不知所以要好得多,而且印象也要深刻得多。

以下便是我看完后的一些总结,看之前可先将以上两篇文章看完后再来阅读,如有不对,还请指正。

Git 的三个分区以及本地文件的三个阶段

1、三个分区

  • 工作目录 ( working directory ):操作系统上的文件,所有代码开发编辑都在这上面完成。
  • 索引( index or staging area ):可以理解为一个暂存区域,这里面的代码会在下一次commit被提交到Git仓库。
  • Git仓库( git repository ):由Git object记录着每一次提交的快照,以及链式结构记录的提交变更历史。

2、三个阶段

  • git add 之前:工作区文件修改,不对索引和 git 仓库有任何影响
  • git add 之后,git commit 之前:

在这个阶段,我之前的理解就是把工作区修改的(跟暂存区之间比较差异的)文件快照放到暂存区,等着提交到 git 仓库。现在的理解是基于 git 仓库里的实体来操作的。

实体对应文章里的对象 object

根据这才是真正的Git——Git内部原理揭秘!文章所说,git add 操作分为两步:

  1. 在 git 仓库产生类型为 blob 的实体
  2. 将暂存区对应文件的索引更新为类型为 blob 的实体的索引

blob 实体:存储文件内容

  • git commit 之后:同上分为三步
  1. Git 首先根据当前的索引生产一个类型为 tree 的实体,充当新提交的一个快照

tree 实体:存储目录结构、文件名以及权限

  1. 创建一个新的 commit 实体,将这次 commit 的信息储存起来,并且 parent 指向上一个 commit,组成一条链记录变更历史。

commit 实体:存储提交的作者、邮箱、日期、提交说明等。

在查看 commit 实体的内容 时除以上信息,还包含一个 tree 实体,再次查看 ** tree 实体的内容**,会发现包含一个或多个 blob 实体, 继续查看 blob 实体的内容,会发现具体的文件内容。

  1. 将当前分支的指针移到新的 commit 结点。

PS:除了以上三个实体,还有一个实体为 tag

tag 实体:存储指向特定提交对象(commit 实体)的引用

什么意思?
新建一个标签,取名 v1.0.0-release,它存储着 commit 实体的引用,通过命令

> git cat-file -p ebb56c // ebb56c 为 v1.0.0-release 保存的 commit 实体的引用,即 sha1的前几位字符

查看得到 commit 实体。

你可能感兴趣的:(git 原理初探)