]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/git-diff-index.txt
Sync with maint
[thirdparty/git.git] / Documentation / git-diff-index.txt
CommitLineData
215a7ad1 1git-diff-index(1)
2cf565c5 2=================
2cf565c5
DG
3
4NAME
5----
b3d6e6e7 6git-diff-index - Compare a tree to the working tree or index
2cf565c5
DG
7
8
9SYNOPSIS
10--------
7791a1d9 11[verse]
b1889c36 12'git diff-index' [-m] [--cached] [<common diff options>] <tree-ish> [<path>...]
2cf565c5
DG
13
14DESCRIPTION
15-----------
b3d6e6e7
JH
16Compares the content and mode of the blobs found in a tree object
17with the corresponding tracked files in the working tree, or with the
18corresponding paths in the index. When <path> arguments are present,
19compares only paths matching those patterns. Otherwise all tracked
20files are compared.
2cf565c5
DG
21
22OPTIONS
23-------
dda2d79a
JH
24include::diff-options.txt[]
25
2cf565c5
DG
26<tree-ish>::
27 The id of a tree object to diff against.
28
2cf565c5
DG
29--cached::
30 do not consider the on-disk file at all
31
32-m::
33 By default, files recorded in the index but not checked
34 out are reported as deleted. This flag makes
0b444cdb 35 'git diff-index' say that all non-checked-out files are up
2cf565c5
DG
36 to date.
37
2cf565c5
DG
38include::diff-format.txt[]
39
76a8788c 40OPERATING MODES
2cf565c5
DG
41---------------
42You can choose whether you want to trust the index file entirely
bcf9626a 43(using the `--cached` flag) or ask the diff logic to show any files
2cf565c5
DG
44that don't match the stat state as being "tentatively changed". Both
45of these operations are very useful indeed.
46
76a8788c 47CACHED MODE
2cf565c5 48-----------
bcf9626a 49If `--cached` is specified, it allows you to ask:
2cf565c5 50
5f3aa197 51 show me the differences between HEAD and the current index
0b444cdb 52 contents (the ones I'd write using 'git write-tree')
2cf565c5 53
2c6e4771 54For example, let's say that you have worked on your working directory, updated
89438677 55some files in the index and are ready to commit. You want to see exactly
44b27ec9 56*what* you are going to commit, without having to write a new tree
2c6e4771 57object and compare it that way, and to do that, you just do
2cf565c5 58
b1889c36 59 git diff-index --cached HEAD
2cf565c5
DG
60
61Example: let's say I had renamed `commit.c` to `git-commit.c`, and I had
483bc4f0
JN
62done an `update-index` to make that effective in the index file.
63`git diff-files` wouldn't show anything at all, since the index file
0b444cdb 64matches my working directory. But doing a 'git diff-index' does:
2cf565c5 65
b1889c36 66 torvalds@ppc970:~/git> git diff-index --cached HEAD
2cf565c5
DG
67 -100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 commit.c
68 +100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 git-commit.c
69
44b27ec9 70You can see easily that the above is a rename.
2cf565c5 71
483bc4f0 72In fact, `git diff-index --cached` *should* always be entirely equivalent to
0b444cdb 73actually doing a 'git write-tree' and comparing that. Except this one is much
2cf565c5
DG
74nicer for the case where you just want to check where you are.
75
0b444cdb 76So doing a `git diff-index --cached` is basically very useful when you are
a6080a0a 77asking yourself "what have I already marked for being committed, and
2cf565c5
DG
78what's the difference to a previous tree".
79
76a8788c 80NON-CACHED MODE
2cf565c5
DG
81---------------
82The "non-cached" mode takes a different approach, and is potentially
83the more useful of the two in that what it does can't be emulated with
0b444cdb 84a 'git write-tree' + 'git diff-tree'. Thus that's the default mode.
2cf565c5
DG
85The non-cached version asks the question:
86
df8baa42 87 show me the differences between HEAD and the currently checked out
7560f547 88 tree - index contents _and_ files that aren't up to date
2cf565c5
DG
89
90which is obviously a very useful question too, since that tells you what
0b444cdb 91you *could* commit. Again, the output matches the 'git diff-tree -r'
2cf565c5
DG
92output to a tee, but with a twist.
93
5f3aa197 94The twist is that if some file doesn't match the index, we don't have
2cf565c5
DG
95a backing store thing for it, and we use the magic "all-zero" sha1 to
96show that. So let's say that you have edited `kernel/sched.c`, but
0b444cdb 97have not actually done a 'git update-index' on it yet - there is no
2cf565c5
DG
98"object" associated with the new state, and you get:
99
62b42d34
JK
100 torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD
101 :100644 100664 7476bb... 000000... kernel/sched.c
2cf565c5 102
7560f547
103i.e., it shows that the tree has changed, and that `kernel/sched.c` is
104not up to date and may contain new stuff. The all-zero sha1 means that to
2cf565c5
DG
105get the real diff, you need to look at the object in the working directory
106directly rather than do an object-to-object diff.
107
0b444cdb 108NOTE: As with other commands of this type, 'git diff-index' does not
2cf565c5
DG
109actually look at the contents of the file at all. So maybe
110`kernel/sched.c` hasn't actually changed, and it's just that you
111touched it. In either case, it's a note that you need to
0b444cdb 112'git update-index' it to make the index be in sync.
2cf565c5 113
df8baa42 114NOTE: You can have a mixture of files show up as "has been updated"
2cf565c5
DG
115and "is still dirty in the working directory" together. You can always
116tell which file is in which state, since the "has been updated" ones
117show a valid sha1, and the "not in sync with the index" ones will
118always have the special all-zero sha1.
119
2cf565c5
DG
120GIT
121---
9e1f0a85 122Part of the linkgit:git[1] suite