Git 是如何保证完整性的

简介: Git 相信大家每天都在使用,但是心中一直有一个疑问,假如在传送过程中丢失信息或者损坏文件,Git 是怎么发现的?

Git 相信大家每天都在使用,但是心中一直有一个疑问,假如在传送过程中丢失信息或者损坏文件,Git 是怎么发现的?

1.Git 官方的说明

其实,Git 中所有的数据在存储前都会计算校验和,然后以校验和来引用。这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。

Git 用以计算校验和的机制叫做SHA-1 散列(hash,哈希)。

这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。

SHA-1 哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

那么问题来了,啥是校验和,啥是 SHA-1? 🤔

2.什么是校验和

来看看维基百科的定义:

校验和(英语:Checksum)是冗余校验的一种形式。

它是通过错误检测方法,对经过空间(如通信)或时间(如计算机存储)所传送数据的完整性进行检查的一种简单方法。

计算机领域常见的校验和的方法有循环冗余校验(CRC)MD5SHA家族等。

产生检验和的实际过程一般是向核对函数或检验和算法输入给定的数据,一个良好的检验和算法通常会对进行很小的修改的输入数据都会输出一个显著不同的值。

所以 Git 的做法就是通过文件内容或者目录结构计算校验和,只有校验和完全一致时才能证明文件或者目录没有发生丢失(因为任何微小的变化都会产生截然不同校验和结果)。

3.SHA-1

SHA-1 是常用的一种计算校验和的算法,其他常用的算法还有 md5 和 sha-256。

4.如何查看文件的校验和

Linux 和 Mac 下获取文件的 CRC、MD5、SHA1、SHA256 值是一样的方式:

cksum 文件名    # CRC
md5sum 文件名   # 获取MD5
shasum 文件名   # 获取SHA1

# -a 支持可选值:1 (default), 224, 256, 384, 512, 512224, 512256
shasum -a 256 文件名   #获取SHA256

来实践一下👨🏻‍💻:

如图所示:

  • 第一次操作通过 shasum 命令获取了我电脑上的名叫 test.txt 文件的 SHA1 值;

  • 第二次操作修改了文件名,改为了 test1.txt,此时获取的 SHA1 值与第一次获取的一样,因此,更改文件名不会导致校验和改变;

  • 第三次操作修改了 test1.txt 文件里面的内容,此次获取 SHA1 值就发生了变化。

因此,我们可以得知:只有相同的文件才会有相同的校验和。更改文件名以外的任何内容都将导致不同的校验和。

5.校验和的常见应用场景

  • 检查下载的文件是否有破损

  • 检查下载的文件是否被恶意替换

相关文章
|
4天前
|
Linux 开发工具 数据安全/隐私保护
分布式版本控制git
分布式版本控制git
|
4天前
|
测试技术 开发工具 git
【git 实用指南】Git提交指南:如何制定团队友好的提交规则
【git 实用指南】Git提交指南:如何制定团队友好的提交规则
107 0
|
9月前
|
缓存 开发工具 git
如何解决git忽略提交规则不生效的问题
如何解决git忽略提交规则不生效的问题
|
11月前
|
开发工具 git
【Git】一文带你入门Git分布式版本控制系统(分支管理策略、Bug分支)
【Git】一文带你入门Git分布式版本控制系统(分支管理策略、Bug分支)
262 0
|
12月前
|
前端开发 开发工具 git
Git业务实践记录
最近在开发一个新的功能,和往常一样先建了一个分支进行开发,开发到周期60%的时候,后端临时通知需要将大功能中的A、B、C三个功能拆分三个迭代分别发布,于是拆分成了三个迭代,后来因为业务上下游支持的因素,并且三块功能堆在一个时间点测试,预发环境只能部署一个分支的版本,所以还是需要将三个分支集成到一个迭代去发布,记录一下整个解决过程和思路。
44 1
|
存储 开发工具 git
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
219 0
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
|
开发工具 git
git分支管理的策略和冲突问题
本文参考于廖雪峰老师的博客Git教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。 当两个分支修改同一个文件时,可能发生两个分支不能自动合并的问题,需要手动解决冲突(合并时...
116 0
git分支管理的策略和冲突问题
|
Shell 开发工具 git
记一次使用因为commit提交大文件无法推送到远程库解决问题过程及git rebase使用
首先,故事(事故)的起因是这样的。 执行删除成功会返回Ref 'refs/heads/master' was rewritten提示,如果返回unchanged则表示没有任何更改。 如果文件路径包含空
206 0
记一次使用因为commit提交大文件无法推送到远程库解决问题过程及git rebase使用
|
存储 测试技术 Linux
分布式版本控制 Git 最佳实践(一)
分布式版本控制 Git 最佳实践(一)
分布式版本控制 Git 最佳实践(一)
|
前端开发 开发工具 git
分布式版本控制 Git 最佳实践(二)
分布式版本控制 Git 最佳实践(二)
分布式版本控制 Git 最佳实践(二)