之前项目都是使用svn,svn比较简单。后来换了项目使用git,有点不方便。经过一段时间学习,现在总结一下。
先说svn存储原理,下面画了一张svn存储原理图。
优点: 便于操作
缺点:服务器单点故障,会丢失代码,容错性差,下载速度慢
一、git的存储原理
1.git记录整体的变化
git的每个版本都一份完整的代码,每次修改后都会把修改的文件重新保存一份,吐过没有修改,只会保存上个版本文件的索引。如图下
2、操作本地执行
Git 不用跑到外面的服务器上去取数据回
来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。
也就是说,git无须联网,也可以实现离线上传。
3、数据完整性
在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。
Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个
SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成,看起来就像是:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。
4、git操作三种状态
好,现在请注意,接下来要讲的概念非常重要。对于任何一个文件,在 Git 内都只有三种状态:
已提交:已提交表示该文件已经被安全地保存在本地数据库中了;
已修改:已修改表示修改了某个文件,但还没有提交保存;
已暂存:已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作目录以及暂存区域。
1) 如果是 git 目录中保存着的特定版本文件,就属于已提交状态;
2) 如果作了修改并已放入暂存区域,就属于已暂存状态;
3)如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
5、git的三种工作状态
1、未提交(工作区)工作空间
2、暂存台, git add (相当于内存快照,在内存中开辟空间)
3、已提交(.git 数据仓库)
6、git这么存储文件的
首先是以对象的方式存储的。并在存储在.git的objects文件中。
如果删除了,可以直接在这个数据仓库中检出
$ rm -rf README.md
git checkout -f HEAD
7、git的核心对象
git核心对象,git是有很多数据组成的,这些数据组成一个个对象。
Blob:blob用来存储文件内容, 或者说表示一个文件
Tree:代表的是目录结构, 或者简单地理解为代表一个目录
Commit:存储一次提交的信息,包括所在的tree,parent是谁,作者及message等信息
每个commit记录了提交一个更新的所有元数据,如指向的tree,父commit,作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当次提交时的目录信息。一个commit可以有多个(至少一个)父commits
Git hash-object 文件git名文件名的哈希码
Git show 哈希码前6位 查询文件内容
Git cat-file -t 哈希码前六为
find .git/objects/ -type f 查询文件
Git ls-tree 哈希码前六为 查看tree对象的存储数据
Commit 对象
一个commit对象对应的是唯一的tree,
8、对象和引用
对象和引用,对象这个概念在上面已经有一个很清晰的认识,对象包含4个对象,blob,tree,commit,tag对象。
那么引用是什么呢?
引用其实就是指针,这个指针指向一个对象。表示引用这个对象。
对象存储模型
Remote 远程分支
Branch 分支
Tag 标签
查看head指针
cat .git/refs/heads/master
查看文件存储内容
9、tag标签
作用是当一个版本进入稳定版本时,打一个tag标签
命令 Git tag 版本号 轻量级的
Git tag -a 版本号 -m “描述信息” 重量级的
————end————
喜欢本文的朋友们,欢迎长按下图关注订阅号凌飞心得,收看更多精彩内容