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