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.校验和的常见应用场景

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

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

相关文章
|
7月前
|
Linux 开发工具 数据安全/隐私保护
分布式版本控制git
分布式版本控制git
|
开发工具 git
Git使用不当导致代码丢失的N种场景
背景git作为目前使用最广泛的分布式版本控制软件,集团内基本上所有开发同学都使用它来做代码管理。一个最典型的使用场景,是一个git仓库存在一个master主干分支,多个需求基于master拉自己的开发分支,然后在发布日时,新建一个release分支,然后原先并行的几个开发分支merge到release分支上,最后基于该分支发布上线,上线后release再merge到master主干上,一次发布完成
2872 1
Git使用不当导致代码丢失的N种场景
|
13天前
|
数据可视化 开发工具 git
如何解决 Git 版本控制系统中冲突的问题?
在Git版本控制系统中,冲突是指在合并或拉取操作时,两个或多个开发者对同一文件的同一部分进行了不同的修改,导致Git无法自动确定应该采用哪种修改。
27 1
|
4月前
|
存储 Linux 测试技术
阿里云块存储问题之在编码和提交代码时确保代码提交的原子性如何解决
阿里云块存储问题之在编码和提交代码时确保代码提交的原子性如何解决
44 0
|
5月前
|
存储 开发工具 数据安全/隐私保护
git 的使用以及如何解决git冲突问题
git 的使用以及如何解决git冲突问题
|
缓存 开发工具 git
如何解决git忽略提交规则不生效的问题
如何解决git忽略提交规则不生效的问题
112 0
|
前端开发 开发工具 git
天天提交代码,git commit 提交时能规范一下吗?
接下来我就来实践一下,首先我这里使用的是pnpm安装依赖的。今天主要是在提交代码时稍微自动化一点,并且让提交规范统一一些。
243 0
|
存储 开发工具 git
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
311 0
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
|
开发工具 git
git分支管理的策略和冲突问题
本文参考于廖雪峰老师的博客Git教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。 当两个分支修改同一个文件时,可能发生两个分支不能自动合并的问题,需要手动解决冲突(合并时...
155 0
git分支管理的策略和冲突问题
|
前端开发 开发工具 git
分布式版本控制 Git 最佳实践(二)
分布式版本控制 Git 最佳实践(二)
分布式版本控制 Git 最佳实践(二)