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

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

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

相关文章
|
8月前
|
Linux 开发工具 数据安全/隐私保护
分布式版本控制git
分布式版本控制git
|
1月前
|
开发工具 git
如果使用git产生了冲突,你是怎么解决的?
在团队开发中,若多人同时修改同一代码位置,拉取时可能会产生冲突。解决冲突需及时与同事沟通确认问题,并使用IDEA等工具进行版本对比,选择合适代码保留。解决步骤包括:查看冲突文件、删除多余代码及标记、使用git add标记冲突已解决、最后git commit提交修改,必要时git push推送更改。
56 6
|
2月前
|
数据可视化 开发工具 git
如何解决 Git 版本控制系统中冲突的问题?
在Git版本控制系统中,冲突是指在合并或拉取操作时,两个或多个开发者对同一文件的同一部分进行了不同的修改,导致Git无法自动确定应该采用哪种修改。
47 1
|
5月前
|
项目管理 开发工具 git
|
5月前
|
消息中间件 小程序 Java
【规范】看看人家Git提交描述,那叫一个规矩
本文通过IDEA中的Git描述规范插件【git commit message helper】,介绍了Git提交描述的规范流程,强调了团队开发中统一标准的重要性,并通过实例展示了规范的提交记录如何提高代码管理和维护效率。最后,文章提供了几个实用的Git提交描述案例,帮助读者更好地理解和应用这些规范。
767 0
【规范】看看人家Git提交描述,那叫一个规矩
|
6月前
|
存储 开发工具 数据安全/隐私保护
git 的使用以及如何解决git冲突问题
git 的使用以及如何解决git冲突问题
|
前端开发 开发工具 git
天天提交代码,git commit 提交时能规范一下吗?
接下来我就来实践一下,首先我这里使用的是pnpm安装依赖的。今天主要是在提交代码时稍微自动化一点,并且让提交规范统一一些。
258 0
|
存储 开发工具 git
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
333 0
Git 进阶系列 | 8. 用 Reflog 恢复丢失的提交
|
Shell 开发工具 git
记一次使用因为commit提交大文件无法推送到远程库解决问题过程及git rebase使用
首先,故事(事故)的起因是这样的。 执行删除成功会返回Ref 'refs/heads/master' was rewritten提示,如果返回unchanged则表示没有任何更改。 如果文件路径包含空
361 0
记一次使用因为commit提交大文件无法推送到远程库解决问题过程及git rebase使用
|
开发工具 数据安全/隐私保护 git
git的分支远程连接和远程分支的拉取推送及冲突处理
本文参考于廖雪峰老师的博客Git 教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。 git push origin branch-name将本地分支推送到远程。 默认 clone
880 0
git的分支远程连接和远程分支的拉取推送及冲突处理