为何Git特定分支的文件历史中不显示已存在的提交?
以下是几种可能导致该现象的核心原因:
文件名大小写隐性变更
Git在Windows/macOS默认开启core.ignorecase=true,会忽略文件名大小写差异,但底层存储严格区分。如果feat分支中曾有提交将my-file.htm改为My-File.htm,之后又改回原名称,表面看文件名没变,但Git会判定为两次重命名操作。普通git log my-file.htm只会追踪当前大小写的文件路径历史,而--follow会跨重命名追踪,因此能找到目标提交。文件删除后重新添加
若feat分支的提交链里,某个提交删除了my-file.htm,后续又有提交重新添加了同名文件(无论内容是否一致),Git会把重建后的文件视为全新对象,普通历史查询不会关联之前的提交。--follow会通过内容哈希匹配关联这类操作,从而找回目标提交。分支历史被改写或过滤合并
如果feat分支是通过git merge --squash、git rebase,或是带路径过滤的合并从dev分支同步过来的,可能会打断文件的历史关联链。这类操作可能只引入了文件内容,却未保留原提交的路径关联信息,导致普通git log无法追踪,而--follow依靠内容匹配能找到源头提交。Git历史追踪逻辑差异
普通git log <file>是基于当前文件的路径对象回溯,只追踪直接修改该路径的提交;而--follow开启了内容追踪模式,只要检测到文件内容在提交间有延续性,就会自动关联,哪怕存在隐性的路径变更(比如大小写、删除重建)。
内容的提问来源于stack exchange,提问作者Romain Prévost

