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