If I touch
在 git 存储库中跟踪的文件,然后运行git diff-index HEAD
,它将打印输出M
表明文件已被修改。例如,
$ touch foo
$ git diff-index HEAD
:100644 100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0000000000000000000000000000000000000000 M foo
我不确定这是否有意义,但这不是问题所在。问题是,如果我运行,为什么输出会改变(没有差异)git diff HEAD
or git status
?
$ touch foo
$ git diff-index HEAD
:100644 100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0000000000000000000000000000000000000000 M foo
$ git diff # no output
$ git diff-index HEAD # no output
我希望结果,无论是什么,在不应该改变任何东西的命令中保持不变。
我们先看一下输出的含义:
:100644 100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0000000000000000000000000000000000000000 M foo
手册 http://git-scm.com/docs/git-diff-index内容如下,从左到右:
- a colon.
- “src”模式;如果创建或未合并,则为 000000。
- a space.
- “dst”模式;如果删除或未合并,则为 000000。
- a space.
- sha1 代表“src”; 0{40}(如果创建或未合并)。
- a space.
- sha1 代表“dst”; 0{40} 如果创建、取消合并或“查看工作树”。
- a space.
- 状态,后跟可选的“分数”数字。
- 使用 -z 选项时为制表符或 NUL。
- “src”的路径
- 使用 -z 选项时为制表符或 NUL;仅存在于 C 或 R 中。
- “dst”的路径;仅存在于 C 或 R 中。
- 使用 -z 选项时为 LF 或 NUL,以终止记录。
有趣的是第8点:
sha1 代表“dst”; 0{40} 如果创建、取消合并或“查看工作树”。
因此,在您的情况下,您会得到 40 个零,因此这意味着“创建”、“取消合并”或“查看工作树”。由于您只触及了该文件,并且它已经被跟踪,因此您可以消除前两个选项。这给我们留下了“看工作树”.
如果你这样做,使用git diff
(它将尝试为所有更改生成实际内容差异,并因此实际查看文件内容),然后 Git 显然发现毕竟没有更改,因此后续调用不再说明任何内容。
这个观察让我相信默认情况下git diff-index
只会快速查看文件,而不会实际比较任何内容。由于您修改了文件日期,Git 认为它“可能已更改”,并且需要更详细的查看才能正确找出它。
如果你跑git diff-index
如果有一个选项要求它更彻底地查看文件,那么它也不会发现任何更改,例如当使用-p
生成补丁的选项(这是一种git diff
does).
所以假设一个文件可能只是性能优化could如果文件修改日期被更改,则被更改,但没有做出实际声明;相反,它只会留下一个“稍后再看”的标记。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)