git总结-git存储原理

之前项目都是使用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————

 

喜欢本文的朋友们,欢迎长按下图关注订阅号凌飞心得,收看更多精彩内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值