git是否重用blob?

git是否重用blob?,git,version-control,Git,Version Control,假设我提交了一个二进制文件,然后在几次提交后对其进行了更改,现在我又在一个新的提交中对其进行了更改 出于好奇,我想知道git是否为它创建了一个新的blob?或者它是否检测到它在历史记录中并重用它?如果是,它是如何检测到的?校验和?Git将重用相同的blob 我做了一个测试。我做了3次承诺。首先我提交一个二进制文件,然后我修改了二进制文件并再次提交。最后,我用第一次提交和再次提交时使用的原始二进制文件重写了该文件 第一次和第三次提交中的二进制文件内容相同。每个提交都是以下分支的头部: 第一次承诺:

假设我提交了一个二进制文件,然后在几次提交后对其进行了更改,现在我又在一个新的提交中对其进行了更改


出于好奇,我想知道git是否为它创建了一个新的blob?或者它是否检测到它在历史记录中并重用它?如果是,它是如何检测到的?校验和?

Git将重用相同的blob

我做了一个测试。我做了3次承诺。首先我提交一个二进制文件,然后我修改了二进制文件并再次提交。最后,我用第一次提交和再次提交时使用的原始二进制文件重写了该文件

第一次和第三次提交中的二进制文件内容相同。每个提交都是以下分支的头部:

第一次承诺:“第一次”。第二次提交:“第二次”。第三次承诺:“主人”

然后,如果运行“git cat file-p FIRST^{tree}”,它将显示二进制文件的哈希代码

$ git cat-file -p FIRST^{tree}
100644 blob ec049240a47b472bd7c31d1fa27118c4fe2f1229    test.db3
$ git cat-file -p SECOND^{tree}
100644 blob a47bb3727e5aefe3ec386bec5520f3e4ffb3a4c5    test.db3
$ git cat-file -p master^{tree}
100644 blob ec049240a47b472bd7c31d1fa27118c4fe2f1229    test.db3
您会发现第一次提交和第三次提交的blob的哈希代码是相同的


git非常聪明,可以检查哈希代码是否存在blob,如果找到了blob,可以重用该blob。

这是正确的答案。这里的关键是SHA1是文件的“键”,就键/值数据库而言,也就是说。SHA1是文件内容的加密校验和(加上一些唯一的ifying内容和大小信息)。两个相同的文件将计算相同的校验和,从而存储一个git对象,其名称为SHA-1校验和。计算校验和的时间无关紧要,只关心存储库中是否有以该校验和为名称的文件。@torek:完全正确。在内部,git回购或多或少是一个键值数据库。键是git对象(提交、树、blob和标记)的SHA1校验和,值是相应的对象。BLOB(和树)的重用是这种结构自动产生的结果。