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