git diff和gif diff-index有什么区别

qvk1mo1f  于 2023-09-29  发布在  Git
关注(0)|答案(3)|浏览(126)

当我想获取git diff文件时,我发现有人使用

git diff-index --cached  --diff-filter=AM --name-only  HEAD

如果我用

git diff --cached --diff-filter=AM --name-only  HEAD

也能得到同样的结果。git diffgit diff-index有什么区别?什么时候必须使用git diff-index而不是git diff

7vux5j2d

7vux5j2d1#

git diff-index是与索引或工作树的差异:
将在树对象中找到的Blob的内容和模式与工作树中相应的跟踪文件或索引中相应的路径进行比较
git diff更通用,可以比较两个文件,或者两个提交,或者(像diff-index)一个树和索引。
在您的例子中,diff HEAD确实会将HEAD与索引区分开,diff-index也是如此。
警告:“git diff --cached“(man)codepath在fsmonitor知道某个文件是干净的时,没有为该文件填充必要的stat信息,最终表现得好像它不干净,这已在Git 2.43(Q4 2023)中得到纠正。
参见commit 6a044a2(2023年9月11日),作者Josip Sokcevic ( sokac )
(由Junio C Hamano -- gitster --合并于commit 671eaaa,2023年9月20日)

diff-lib:修复fsmonitor打开时的check_removed

签字人:约瑟普·索克切维奇
git diff-indexman)可能会返回错误的已删除条目,当fsmonitor在包含git子模块的存储库中使用时。
这可以在Mac机器上观察到,但它也会影响所有其他支持的平台。
如果使用fsmonitor,如果cache_entry设置了CE_FSMONITOR_VALID,则stat *st不会初始化。
但是,有三个调用站点依赖于事后统计,这可能导致不正确的结果。
此更改部分恢复了commit 4f3d6d0(“fsmonitor:skip lstat deletion check during git diff-index“,2021-03-17,Git v2.32.0-rc0 -- merge listed in batch #4)。

vhmi4jdf

vhmi4jdf2#

diff-index是一个较低级别的操作,它做得较少,但速度快得多,因为它不查看内容,它只检查时间戳等元数据。只有在Linux上,你可以用类似这样的东西来验证这一点:

strace -f -e file -o diff-index.log git diff-index HEAD
  wc diff-index.log
  less diff-index.log

忘记diff-index吧,除非你有一些git性能问题需要解决。
https://git-scm.com/docs/git-update-index#_using_assume_unchanged_bit
https://public-inbox.org/git/[email protected]/

wz3gfoph

wz3gfoph3#

在研究了这两个命令之间的差异之后,我发现了starange行为:
如果文件已更改但内容未更改,则看起来git diff-index是敏感的。而git diff在这种情况下不敏感。
换句话说,如果你想知道一个文件是否没有被更改,但你不关心最后一次更改的时间戳被更改,使用git diff

  • 注:我不确定我在这里是正确的。

相关问题