git commit hash是否等于存储库状态?

时间:2015-05-27 11:39:11

标签: git hash sha data-integrity

每个git commit都归因于一个“签名”其内容的哈希。 它是否也标志了提交的来源,还是只是用于哈希计算的提交数据本身?

不同的措辞:是否不可能(除了散列冲突)伪造第二个存储库,其头部提交具有完全相同的散列和相同的内容,但树的其余部分不同?

1 个答案:

答案 0 :(得分:4)

第二个问题的答案是肯定的(这是不可能的等等)。

第一个问题并不像我想的那样好,因为提交哈希实际上只是基于提交数据。导致第二个问题答案的关键是“提交数据”包括这些关键项,您可以在实际提交中看到这些项:

$ git cat-file -p HEAD
tree 22abd5c3fed5e2f49fb71e10b39d8c4929e51fc7
parent 4ebdeb68ba87282f87c39d790ba17fe1e021cc97
parent 9eabf5b536662000f79978c4d1b6e4eff5c8d785
[snip]

tree行给出了树的哈希值(仅取决于树内容)和parent行 - 在这种情况下为HEAD是合并提交 - 给父级的哈希提交。鉴于当前提交的哈希取决于其树和父(s)的哈希值,如果您要构建具有不同历史记录或不同树的不同仓库,那么这些将具有不同的哈希值,以便提交将也有不同的哈希。

(此处通常使用的技术术语是Merkle Tree。)