>> >> >>Indexer<< << << <<<<<< Idx >>>>>>
Matched: 0
diff-index
M: 2025-12-31 - ljf12825

简单来说,git diff-index是一个用于比较Git索引(暂存区)与某个特定提交(或树对象)之间的低级别命令

  • “低级”命令:这意味着它功能强大且直接,但通常不如我们日常使用的高级命令(如git diffgit status)那么用户友好。它输出的格式更原始,常用于脚本或作为其他高级命令的底层实现
  • 比较对象:它的核心的比较双方是
    • Git索引:也就是暂存区,使用git add后文件存放的地方
    • 一个树对象:通常是一个提交(如HEAD、某个分支名或commit hash),但也可以是任何树对象

基本语法

git diff-index [<选项>] <commit> [--] [<路径>...]
  • <commit>:要与之比较的提交,最常见的是HEAD
  • [<路径>...]:可选的路径限制,只比较特定文件或目录
  • --:可选的分隔符,用于明确表示后面跟的是文件路径,而不是分支或选项

示例

  1. 比较暂存区与最后一次提交(HEAD) 这是最常用的场景,它可以告诉你哪些修改已经被git add到了暂存区
git diff-index HEAD 

输出示例

:100644 100644 7898192... 0623b42... M      README.md
:100644 100644 6be6f5a... 8da6b8a... M      src/main.py
:000000 100644 0000000... e69de29... A      new_file.txt

输出遵循git diff-index的格式,每一行代表一个文件的变更

  • 模式变更::100644 100644
    • 第一个模式是提交(HEAD)中的文件模式
    • 第二个模式是索引(暂存区)中的文件模式
    • 100644代表普通文件,100755代表可执行文件,160000代表子模块,000000代表文件不存在
  • SHA-1哈希:7898192... 0623b42...
    • 第一个SHA-1是提交(HEAD)中的文件blob哈希
    • 第二个SHA-2是索引(暂存区)中的文件blob哈希
  • 状态标识:M, A, D
    • M:文件内容被修改
    • A:文件是新添加的
    • D:文件被删除
    • R:文件被重命名
    • T:文件类型被更改(如从普通文件变为链接)
  • 文件名:最后的README.md是文件名
  1. 更友好的输出(使用--patch-p) 默认的输出信息量很大但不直观。可以让它输出像git diff那样的补丁格式
git diff-index -p HEAD 

输出示例

diff --git a/README.md b/README.md
index 7898192..0623b42 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 # My Project
+This is a new line added to the README.

这样就能清晰地看到每个文件具体修改了什么内容,和git diff --cached的输出非常相似

相关命令对比

命令比较双方主要用途
git diff-index HEAD索引(暂存区)vs 最后一次提交(HEAD查看以暂存的更改(准备提交的更改)
git diff(无参数)工作区 vs 索引查看未暂存的更改(还没有git add的更改)
git diff --cached(或git diff --staged索引 vs HEAD查看所有更改的总和(包括已暂存和未暂存的)
git diff HEAD工作区 vs HEAD查看所有更改的总和(包括已暂存和未暂存)
git status-给出一个概括性的、人类可读的变更总结,告诉你哪些文件被修改、已暂存或未跟踪

git diff-index HEAD 在功能上等同于git diff --cached