为什么“git ls-files -s”和“git log”输出不同的SHA哈希?

问题描述

在同一个文件上使用 'git ls-files -s' 和 'git log' 时,我得到不同的 SHA 哈希值。以 repo https://github.com/preservim/nerdtree 中的 lib/nerdtree/nerdtree.vim 文件为例,标记为 6.10.5。

命令 git log lib/nerdtree/nerdtree.vim 产生,

commit 593c16add35a5461f189b8189abe219f7bbbd604 (tag: 6.10.5)

但是命令 git ls-files -s lib/nerdtree/nerdtree.vim 产生,

100644 61a11a96ba44c7b1bf0472b598f2c967b2dce9f2 0 lib/nerdtree/nerdtree.vim

如果我尝试检出 'git log' 返回的 SHA,该命令会成功。如果我尝试检查“git ls-files -s”返回的 SHA,则会产生致命错误

git checkout 61a11a96ba44c7b1bf0472b598f2c967b2dce9f2 lib/nerdtree/nerdtree.vim

fatal: reference is not a tree: 61a11a96ba44c7b1bf0472b598f2c967b2dce9f2

为什么 'git ls-files -s' 和 'git log' 会为同一个文件生成不同的 SHA 哈希值?

注意:我四处寻找答案并找到了这个主题Git - finding the SHA1 of an individual file in the index。该线程解释了为什么“git hash-object”和“git ls-files -s”的输出之间可能存在差异,但它没有解释“git ls-files -s”和“git”的输出间的差异记录'。

解决方法

原因是:

  1. git log 返回的哈希是标识提交的哈希。
  2. git ls-files -s 返回的哈希值是文件 blob 的标识符。
,

git log 带有路径列表提交更改该路径记录的内容

带有路径的

git ls-files 列出了您当前在该路径结账时记录的内容