前言
最近一直在研究 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 操作分为两步:
- 在 git 仓库产生类型为 blob 的实体
- 将暂存区对应文件的索引更新为类型为 blob 的实体的索引
blob 实体:存储文件内容
- git commit 之后:同上分为三步
- Git 首先根据当前的索引生产一个类型为 tree 的实体,充当新提交的一个快照
tree 实体:存储目录结构、文件名以及权限
- 创建一个新的 commit 实体,将这次 commit 的信息储存起来,并且 parent 指向上一个 commit,组成一条链记录变更历史。
commit 实体:存储提交的作者、邮箱、日期、提交说明等。
在查看 commit 实体的内容 时除以上信息,还包含一个 tree 实体,再次查看 ** tree 实体的内容**,会发现包含一个或多个 blob 实体, 继续查看 blob 实体的内容,会发现具体的文件内容。
- 将当前分支的指针移到新的 commit 结点。
PS:除了以上三个实体,还有一个实体为 tag
tag 实体:存储指向特定提交对象(commit 实体)的引用
什么意思?
新建一个标签,取名 v1.0.0-release,它存储着 commit 实体的引用,通过命令
> git cat-file -p ebb56c // ebb56c 为 v1.0.0-release 保存的 commit 实体的引用,即 sha1的前几位字符
查看得到 commit 实体。
网友评论