所有 Git 操作无非就是对 Git对象的操作,Git 对象包括 Blob对象、Tree对象、Commit对象和 Tag对象。
Blob 对象是一个二进制大对象,代表各个文件,存储所有文件除元数据之外的内容数据。 Gıt 仓库中以 SHA-1 值来标识 Blob,所以不按文件名寻址而是按内容寻址。
- Bolb当然是在
git add filename
之后创建的。
Tree 对象是一个二进制文件,代表各个目录,存储对 Blob对象和其它 Tree对象的引用(SHA-1 值),解决文件名的保存问题。Gıt 仓库同样以 SHA-1 值来标识 Tree。
- 实际上,只需要 Tree 和 Blob 就能够保存 Git 仓库的当前状态,也就是 Git 快照。
- 如果 Blob对象代表的文件没有变更,则所有 Tree对象始终通过同一个SHA-1 值保持对它的引用,否则变更导致 SHA-1变化时将更新 Tree对象所引用的SHA-1 值。效果就是,如果该文件没变更,后面所有版本的快照中都将引用该文件。
Commit 对象是一个二进制文件,代表各个版本,存储对 Tree对象的引用(SHA-1 值)之外,还存储谁在什么时间以及为什么保存了某些快照等说明信息,解决快照的保存问题。Gıt 仓库同样以 SHA-1 值来标识 Commit。
- 可以将 Commit对象视为链表的各个节点。 除第一个 Commit对象外,每个 Commit对象都有一个指向父 Commit对象的指针,一个 Commit可以有多个父 Commit,通过这些指针就能完成对提交的切换。
Tag 对象是一个二进制文件,代表各个版本号,存储对 Commit对象的引用(SHA-1 值)以及指定给它的标签信息,解决 Commit对象的标注问题。 Gıt 仓库同样以 SHA-1 值来标识 Tag。
分支本质上是一个可变指针,是一个有名字的对 Commit对象的引用(SHA-1 值),分支始终指向最新提交,解决的是提交的分离与合并问题。
- Git 默认分支名是 master。前段时间因为 BLM 改为“main”,但后来又提供了自由选择选项。
- 分支看起来与标签 Tag 对象很像,只不过分支随着最新提交不断移动,而标签始终固定。
- 合并的分支就是提交的提交,会产生合并点的提交拥有多个父提交的现象。
所以,Git 存储数据的过程大概是这样的:
-
git add暂存文件后,创建 Blob对象和 Tree对象:
-
git commit提交暂存区后,创建Commit对象:
3,多次提交后:
4,再打上标签v1.0:
5,分支的产生与切换:
6,在分支中工作:
7,合并分支:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98073.html