当我想获取git diff文件时,我发现有人使用
git diff-index --cached --diff-filter=AM --name-only HEAD
如果我用
git diff --cached --diff-filter=AM --name-only HEAD
也能得到同样的结果。git diff和git diff-index有什么区别?什么时候必须使用git diff-index而不是git diff?
git diff
git diff-index
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 HEAD
diff-index
git diff --cached
sokac
gitster
diff-lib
check_removed
签字人:约瑟普·索克切维奇git diff-index(man)可能会返回错误的已删除条目,当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)。
cache_entry
CE_FSMONITOR_VALID
stat *st
fsmonitor
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_bithttps://public-inbox.org/git/[email protected]/
wz3gfoph3#
在研究了这两个命令之间的差异之后,我发现了starange行为:如果文件已更改但内容未更改,则看起来git diff-index是敏感的。而git diff在这种情况下不敏感。换句话说,如果你想知道一个文件是否没有被更改,但你不关心最后一次更改的时间戳被更改,使用git diff。
3条答案
按热度按时间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-index
(man)可能会返回错误的已删除条目,当fsmonitor在包含git子模块的存储库中使用时。这可以在Mac机器上观察到,但它也会影响所有其他支持的平台。
如果使用fsmonitor,如果
cache_entry
设置了CE_FSMONITOR_VALID
,则stat *st
不会初始化。但是,有三个调用站点依赖于事后统计,这可能导致不正确的结果。
此更改部分恢复了commit 4f3d6d0(“
fsmonitor
:skip lstat deletion check duringgit diff-index
“,2021-03-17,Git v2.32.0-rc0 -- merge listed in batch #4)。vhmi4jdf2#
diff-index是一个较低级别的操作,它做得较少,但速度快得多,因为它不查看内容,它只检查时间戳等元数据。只有在Linux上,你可以用类似这样的东西来验证这一点:
忘记diff-index吧,除非你有一些git性能问题需要解决。
https://git-scm.com/docs/git-update-index#_using_assume_unchanged_bit
https://public-inbox.org/git/[email protected]/
wz3gfoph3#
在研究了这两个命令之间的差异之后,我发现了starange行为:
如果文件已更改但内容未更改,则看起来
git diff-index
是敏感的。而git diff
在这种情况下不敏感。换句话说,如果你想知道一个文件是否没有被更改,但你不关心最后一次更改的时间戳被更改,使用
git diff
。