简体中文 ▾ Topics ▾ Latest version ▾ git-diff-index last updated in 2.48.0

名称

git-diff-index - 比较树和工作树或索引

概述

git diff-index [-m] [--cached] [--merge-base] [<提交差异选项>] <目录树对象> [<路径>…​]

描述

将树对象中发现的 blob 的内容和模式与工作树中的相应跟踪文件或索引中的相应路径进行比较。 如果存在 <路径> 参数,则只比较与这些模式匹配的路径。 否则,将比较所有跟踪文件。

选项

Warning

Missing zh_HANS-CN/diff-options.adoc

See original version for this content.

<tree-ish>

树对象的 id。

--cached

完全不考虑磁盘文件。

--merge-base

与其直接比较 <目录树对象>,不如使用 <目录树对象> 和 HEAD 之间的合并基数。 <目录树对象> 必须是一个提交。

-m

默认情况下,索引中有记录但未签出的文件会被报告为已删除。 这个标记会让 git diff-index 认为所有未签出的文件都是最新的。

Warning

Missing zh_HANS-CN/diff-format.adoc

See original version for this content.

运行模式

你可以选择是完全信任索引文件(使用 --cached 标志),还是要求 diff 逻辑将任何与统计状态不匹配的文件显示为 "暂定更改"。 这两种操作都非常有用。

缓存模式

如果指定了 --cached,则可以询问:

向我显示 HEAD 和当前索引
内容(即我使用 'git write-tree' 写入的内容)之间的差异

举个例子,假设你在工作目录中工作,更新了索引中的一些文件,准备提交。你想知道你 提交的内容,而不需要写一个新的树对象并进行比较

git diff-index --cached HEAD

示例:假设我把 commit.c 重命名为 git-commit.c,并执行了 update-index 使其在索引文件中生效。 由于索引文件与我的工作目录一致,所以`git diff-files`根本不会显示任何内容。但使用 'git diff-index ' 就可以:

torvalds@ppc970:~/git> git diff-index --cached HEAD
-100644 blob    4161aecc6700a2eb579e842af0b7f22b98443f74        commit.c
+100644 blob    4161aecc6700a2eb579e842af0b7f22b98443f74        git-commit.c

不难看出,以上是重命名。

事实上,git diff-index --cached 应当 总是完全等同于实际执行 git write-tree 并进行比较。只不过,这个方法更适合只想查看当前位置的情况。

因此,当你问自己 “我已经标记了哪些内容要提交,与之前的树有什么不同” 时,使用 git diff-index --cached 基本上是非常有用的。

非缓存模式

“非缓存” 模式采用的是另一种方法,而且可能是两种模式中最有用的一种,因为它的功能无法用 git write-tree + git diff-tree 来模拟。因此这是默认模式。 非缓存版本提出的问题是:

向我显示 HEAD 与当前已签出树之间的差异 -
索引内容 _ 和未更新的文件

这显然也是一个非常有用的问题,因为它会告诉你*可能*提交的内容。同样,输出结果与 git diff-tree -r 的输出结果完全吻合,但又有所变化。

问题在于,如果某个文件与索引不匹配,我们就不会为它建立备份存储,我们会使用 “全零” sha1 来显示这一点。比方说,你编辑了 kernel/sched.c,但实际上还没有执行 git update-index --没有与新状态相关联的 “对象”,你就会得到:

torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD
:100644 100644 7476bb5ba 000000000 M	kernel/sched.c

也就是说,它显示树已经改变,而且 kernel/sched.c 不是最新的,可能包含新的内容。全零的 sha1 意味着要获得真正的差异,需要直接查看工作目录中的对象,而不是进行对象间的差异。

Note
与其他同类命令一样,git diff-index 实际上并不查看文件内容。所以也许 kernel/sched.c 实际上并没有改变,只是你看了一下而已。无论哪种情况,都需要 git update-index 来使索引同步。
Note
你可以让各种文件同时显示为 “已更新” 和 “仍在工作目录中”。由于 “已更新” 的文件会显示有效的 sha1,而 “未与索引同步” 的文件则会显示特殊的全零 sha1,因此你总能分辨出哪个文件处于哪种状态。

GIT

属于 git[1] 文档

scroll-to-top