]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/revisions.txt
A few more topics after 2.41-rc1
[thirdparty/git.git] / Documentation / revisions.txt
CommitLineData
5a8f3117
MG
1SPECIFYING REVISIONS
2--------------------
3
61e508d9 4A revision parameter '<rev>' typically, but not necessarily, names a
d5fa1f1a 5commit object. It uses what is called an 'extended SHA-1'
5a8f3117 6syntax. Here are various ways to spell object names. The
b62c7697 7ones listed near the end of this list name trees and
5a8f3117
MG
8blobs contained in a commit.
9
88184c1f
AH
10NOTE: This document shows the "raw" syntax as seen by git. The shell
11and other UIs might require additional quoting to protect special
12characters and to avoid word splitting.
13
61e508d9 14'<sha1>', e.g. 'dae86e1950b1277e545cee180551750029cfe735', 'dae86e'::
d5fa1f1a 15 The full SHA-1 object name (40-byte hexadecimal string), or
b62c7697 16 a leading substring that is unique within the repository.
5a8f3117 17 E.g. dae86e1950b1277e545cee180551750029cfe735 and dae86e both
b62c7697 18 name the same commit object if there is no other object in
5a8f3117
MG
19 your repository whose object name starts with dae86e.
20
61e508d9 21'<describeOutput>', e.g. 'v1.7.4.2-679-g3bee7fb'::
b62c7697 22 Output from `git describe`; i.e. a closest tag, optionally
5a8f3117 23 followed by a dash and a number of commits, followed by a dash, a
83456b13 24 'g', and an abbreviated object name.
5a8f3117 25
61e508d9
MG
26'<refname>', e.g. 'master', 'heads/master', 'refs/heads/master'::
27 A symbolic ref name. E.g. 'master' typically means the commit
83456b13
MG
28 object referenced by 'refs/heads/master'. If you
29 happen to have both 'heads/master' and 'tags/master', you can
2de9b711 30 explicitly say 'heads/master' to tell Git which one you mean.
89ce391b 31 When ambiguous, a '<refname>' is disambiguated by taking the
5a8f3117
MG
32 first match in the following rules:
33
89ce391b 34 . If '$GIT_DIR/<refname>' exists, that is what you mean (this is usually
661c3e9b
MM
35 useful only for `HEAD`, `FETCH_HEAD`, `ORIG_HEAD`, `MERGE_HEAD`
36 and `CHERRY_PICK_HEAD`);
5a8f3117 37
89ce391b 38 . otherwise, 'refs/<refname>' if it exists;
5a8f3117 39
b62c7697 40 . otherwise, 'refs/tags/<refname>' if it exists;
5a8f3117 41
89ce391b 42 . otherwise, 'refs/heads/<refname>' if it exists;
5a8f3117 43
89ce391b 44 . otherwise, 'refs/remotes/<refname>' if it exists;
5a8f3117 45
89ce391b 46 . otherwise, 'refs/remotes/<refname>/HEAD' if it exists.
5a8f3117 47+
661c3e9b
MM
48`HEAD` names the commit on which you based the changes in the working tree.
49`FETCH_HEAD` records the branch which you fetched from a remote repository
83456b13 50with your last `git fetch` invocation.
661c3e9b 51`ORIG_HEAD` is created by commands that move your `HEAD` in a drastic
c6eec9cb
PB
52way (`git am`, `git merge`, `git rebase`, `git reset`),
53to record the position of the `HEAD` before their operation, so that
b62c7697
MG
54you can easily change the tip of the branch back to the state before you ran
55them.
661c3e9b 56`MERGE_HEAD` records the commit(s) which you are merging into your branch
83456b13 57when you run `git merge`.
661c3e9b 58`CHERRY_PICK_HEAD` records the commit which you are cherry-picking
83456b13 59when you run `git cherry-pick`.
5a8f3117 60+
83456b13 61Note that any of the 'refs/*' cases above may come either from
68ed71b5 62the `$GIT_DIR/refs` directory or from the `$GIT_DIR/packed-refs` file.
e1c3bf49 63While the ref name encoding is unspecified, UTF-8 is preferred as
1452bd64 64some output processing may assume ref names in UTF-8.
5a8f3117 65
9ba89f48 66'@'::
661c3e9b 67 '@' alone is a shortcut for `HEAD`.
9ba89f48 68
d86d2074 69'[<refname>]@{<date>}', e.g. 'master@\{yesterday\}', 'HEAD@{5 minutes ago}'::
61e508d9 70 A ref followed by the suffix '@' with a date specification
5a8f3117 71 enclosed in a brace
c200deb8
MK
72 pair (e.g. '\{yesterday\}', '{1 month 2 weeks 3 days 1 hour 1
73 second ago}' or '{1979-02-26 18:30:00}') specifies the value
5a8f3117
MG
74 of the ref at a prior point in time. This suffix may only be
75 used immediately following a ref name and the ref must have an
83456b13 76 existing log ('$GIT_DIR/logs/<ref>'). Note that this looks up the state
5a8f3117 77 of your *local* ref at a given time; e.g., what was in your local
83456b13 78 'master' branch last week. If you want to look at commits made during
bcf9626a 79 certain times, see `--since` and `--until`.
5a8f3117 80
c200deb8 81'<refname>@{<n>}', e.g. 'master@\{1\}'::
61e508d9 82 A ref followed by the suffix '@' with an ordinal specification
b62c7697 83 enclosed in a brace pair (e.g. '\{1\}', '\{15\}') specifies
5a8f3117
MG
84 the n-th prior value of that ref. For example 'master@\{1\}'
85 is the immediate prior value of 'master' while 'master@\{5\}'
86 is the 5th prior value of 'master'. This suffix may only be used
87 immediately following a ref name and the ref must have an existing
61e508d9 88 log ('$GIT_DIR/logs/<refname>').
5a8f3117 89
c200deb8 90'@{<n>}', e.g. '@\{1\}'::
61e508d9 91 You can use the '@' construct with an empty ref part to get at a
b62c7697
MG
92 reflog entry of the current branch. For example, if you are on
93 branch 'blabla' then '@\{1\}' means the same as 'blabla@\{1\}'.
5a8f3117 94
c200deb8
MK
95'@{-<n>}', e.g. '@{-1}'::
96 The construct '@{-<n>}' means the <n>th branch/commit checked out
5a8f3117
MG
97 before the current one.
98
d86d2074 99'[<branchname>]@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}'::
8cdab69d
TK
100 A branch B may be set up to build on top of a branch X (configured with
101 `branch.<name>.merge`) at a remote R (configured with
102 `branch.<name>.remote`). B@{u} refers to the remote-tracking branch for
103 the branch X taken from remote R, typically found at `refs/remotes/R/X`.
5a8f3117 104
d86d2074 105'[<branchname>]@\{push\}', e.g. 'master@\{push\}', '@\{push\}'::
adfe5d04
JK
106 The suffix '@\{push}' reports the branch "where we would push to" if
107 `git push` were run while `branchname` was checked out (or the current
8cdab69d
TK
108 `HEAD` if no branchname is specified). Like for '@\{upstream\}', we report
109 the remote-tracking branch that corresponds to that branch at the remote.
adfe5d04
JK
110+
111Here's an example to make it more clear:
112+
113------------------------------
114$ git config push.default current
115$ git config remote.pushdefault myfork
328c6cb8 116$ git switch -c mybranch origin/master
adfe5d04
JK
117
118$ git rev-parse --symbolic-full-name @{upstream}
119refs/remotes/origin/master
120
121$ git rev-parse --symbolic-full-name @{push}
122refs/remotes/myfork/mybranch
123------------------------------
124+
125Note in the example that we set up a triangular workflow, where we pull
126from one location and push to another. In a non-triangular workflow,
127'@\{push}' is the same as '@\{upstream}', and there is no need for it.
244ea1b5
ÆAB
128+
129This suffix is also accepted when spelled in uppercase, and means the same
130thing no matter the case.
adfe5d04 131
d86d2074 132'<rev>{caret}[<n>]', e.g. 'HEAD{caret}, v1.5.1{caret}0'::
61e508d9 133 A suffix '{caret}' to a revision parameter means the first parent of
5a8f3117 134 that commit object. '{caret}<n>' means the <n>th parent (i.e.
61e508d9
MG
135 '<rev>{caret}'
136 is equivalent to '<rev>{caret}1'). As a special rule,
137 '<rev>{caret}0' means the commit itself and is used when '<rev>' is the
5a8f3117
MG
138 object name of a tag object that refers to a commit object.
139
6a12e99a
DL
140'<rev>{tilde}[<n>]', e.g. 'HEAD{tilde}, master{tilde}3'::
141 A suffix '{tilde}' to a revision parameter means the first parent of
142 that commit object.
61e508d9 143 A suffix '{tilde}<n>' to a revision parameter means the commit
70eb1307 144 object that is the <n>th generation ancestor of the named
b62c7697 145 commit object, following only the first parents. I.e. '<rev>{tilde}3' is
61e508d9 146 equivalent to '<rev>{caret}{caret}{caret}' which is equivalent to
b62c7697 147 '<rev>{caret}1{caret}1{caret}1'. See below for an illustration of
5a8f3117
MG
148 the usage of this form.
149
c200deb8 150'<rev>{caret}{<type>}', e.g. 'v0.99.8{caret}\{commit\}'::
61e508d9 151 A suffix '{caret}' followed by an object type name enclosed in
abdb54a1
RH
152 brace pair means dereference the object at '<rev>' recursively until
153 an object of type '<type>' is found or the object cannot be
154 dereferenced anymore (in which case, barf).
155 For example, if '<rev>' is a commit-ish, '<rev>{caret}\{commit\}'
156 describes the corresponding commit object.
157 Similarly, if '<rev>' is a tree-ish, '<rev>{caret}\{tree\}'
158 describes the corresponding tree object.
159 '<rev>{caret}0'
b62c7697 160 is a short-hand for '<rev>{caret}\{commit\}'.
a6a3f2cc 161+
e277ff43
DL
162'<rev>{caret}\{object\}' can be used to make sure '<rev>' names an
163object that exists, without requiring '<rev>' to be a tag, and
164without dereferencing '<rev>'; because a tag is already an object,
a6a3f2cc 165it does not have to be dereferenced even once to get to an object.
75aa26d3 166+
e277ff43 167'<rev>{caret}\{tag\}' can be used to ensure that '<rev>' identifies an
75aa26d3 168existing tag object.
5a8f3117 169
c200deb8 170'<rev>{caret}{}', e.g. 'v0.99.8{caret}{}'::
61e508d9
MG
171 A suffix '{caret}' followed by an empty brace pair
172 means the object could be a tag,
5a8f3117
MG
173 and dereference the tag recursively until a non-tag object is
174 found.
175
c200deb8 176'<rev>{caret}{/<text>}', e.g. 'HEAD^{/fix nasty bug}'::
61e508d9
MG
177 A suffix '{caret}' to a revision parameter, followed by a brace
178 pair that contains a text led by a slash,
b62c7697 179 is the same as the ':/fix nasty bug' syntax below except that
32574b68 180 it returns the youngest matching commit which is reachable from
61e508d9 181 the '<rev>' before '{caret}'.
32574b68 182
61e508d9
MG
183':/<text>', e.g. ':/fix nasty bug'::
184 A colon, followed by a slash, followed by a text, names
95ad6d2d 185 a commit whose commit message matches the specified regular expression.
5a8f3117 186 This name returns the youngest matching commit which is
6b3351e7
WC
187 reachable from any ref, including HEAD.
188 The regular expression can match any part of the
0769854f
WP
189 commit message. To match messages starting with a string, one can use
190 e.g. ':/^foo'. The special sequence ':/!' is reserved for modifiers to what
191 is matched. ':/!-foo' performs a negative match, while ':/!!foo' matches a
192 literal '!' character, followed by 'foo'. Any other sequence beginning with
193 ':/!' is reserved for now.
88184c1f
AH
194 Depending on the given text, the shell's word splitting rules might
195 require additional quoting.
5a8f3117 196
4ad1b2c7 197'<rev>:<path>', e.g. 'HEAD:README', 'master:./README'::
61e508d9 198 A suffix ':' followed by a path names the blob or tree
5a8f3117
MG
199 at the given path in the tree-ish object named by the part
200 before the colon.
b62c7697
MG
201 A path starting with './' or '../' is relative to the current working directory.
202 The given path will be converted to be relative to the working tree's root directory.
979f7929 203 This is most useful to address a blob or tree from a commit or tree that has
b62c7697 204 the same tree structure as the working tree.
5a8f3117 205
4ad1b2c7 206':[<n>:]<path>', e.g. ':0:README', ':README'::
61e508d9
MG
207 A colon, optionally followed by a stage number (0 to 3) and a
208 colon, followed by a path, names a blob object in the
b62c7697 209 index at the given path. A missing stage number (and the colon
61e508d9 210 that follows it) names a stage 0 entry. During a merge, stage
5a8f3117
MG
211 1 is the common ancestor, stage 2 is the target branch's version
212 (typically the current branch), and stage 3 is the version from
b62c7697 213 the branch which is being merged.
5a8f3117
MG
214
215Here is an illustration, by Jon Loeliger. Both commit nodes B
216and C are parents of commit node A. Parent commits are ordered
217left-to-right.
218
219........................................
220G H I J
221 \ / \ /
222 D E F
223 \ | / \
224 \ | / |
225 \|/ |
226 B C
227 \ /
228 \ /
229 A
230........................................
231
232 A = = A^0
233 B = A^ = A^1 = A~1
39102cf4 234 C = = A^2
5a8f3117
MG
235 D = A^^ = A^1^1 = A~2
236 E = B^2 = A^^2
237 F = B^3 = A^^3
238 G = A^^^ = A^1^1^1 = A~3
239 H = D^2 = B^^2 = A^^^2 = A~2^2
240 I = F^ = B^3^ = A^^3^
241 J = F^2 = B^3^2 = A^^3^2
242
243
244SPECIFYING RANGES
245-----------------
246
83456b13 247History traversing commands such as `git log` operate on a set
0b451248
PO
248of commits, not just a single commit.
249
250For these commands,
251specifying a single revision, using the notation described in the
252previous section, means the set of commits `reachable` from the given
253commit.
254
f5d9e91e
PB
255Specifying several revisions means the set of commits reachable from
256any of the given commits.
257
0b451248
PO
258A commit's reachable set is the commit itself and the commits in
259its ancestry chain.
260
f302c1e4
JH
261There are several notations to specify a set of connected commits
262(called a "revision range"), illustrated below.
263
5a8f3117 264
391a3c70
PO
265Commit Exclusions
266~~~~~~~~~~~~~~~~~
267
268'{caret}<rev>' (caret) Notation::
269 To exclude commits reachable from a commit, a prefix '{caret}'
270 notation is used. E.g. '{caret}r1 r2' means commits reachable
1afe13b9
PO
271 from 'r2' but exclude the ones reachable from 'r1' (i.e. 'r1' and
272 its ancestors).
391a3c70
PO
273
274Dotted Range Notations
275~~~~~~~~~~~~~~~~~~~~~~
276
277The '..' (two-dot) Range Notation::
278 The '{caret}r1 r2' set operation appears so often that there is a shorthand
279 for it. When you have two commits 'r1' and 'r2' (named according
280 to the syntax explained in SPECIFYING REVISIONS above), you can ask
281 for commits that are reachable from r2 excluding those that are reachable
282 from r1 by '{caret}r1 r2' and it can be written as 'r1..r2'.
283
5fd9d173 284The '\...' (three-dot) Symmetric Difference Notation::
391a3c70
PO
285 A similar notation 'r1\...r2' is called symmetric difference
286 of 'r1' and 'r2' and is defined as
287 'r1 r2 --not $(git merge-base --all r1 r2)'.
288 It is the set of commits that are reachable from either one of
289 'r1' (left side) or 'r2' (right side) but not from both.
290
291In these two shorthand notations, you can omit one end and let it default to HEAD.
003c84f6
JH
292For example, 'origin..' is a shorthand for 'origin..HEAD' and asks "What
293did I do since I forked from the origin branch?" Similarly, '..origin'
294is a shorthand for 'HEAD..origin' and asks "What did the origin do since
295I forked from them?" Note that '..' would mean 'HEAD..HEAD' which is an
296empty range that is both reachable and unreachable from HEAD.
297
f302c1e4
JH
298Commands that are specifically designed to take two distinct ranges
299(e.g. "git range-diff R1 R2" to compare two ranges) do exist, but
300they are exceptions. Unless otherwise noted, all "git" commands
301that operate on a set of commits work on a single revision range.
302In other words, writing two "two-dot range notation" next to each
303other, e.g.
304
305 $ git log A..B C..D
306
307does *not* specify two revision ranges for most commands. Instead
308it will name a single connected set of commits, i.e. those that are
309reachable from either B or D but are reachable from neither A or C.
310In a linear history like this:
311
312 ---A---B---o---o---C---D
313
314because A and B are reachable from C, the revision range specified
315by these two dotted ranges is a single commit D.
316
317
391a3c70
PO
318Other <rev>{caret} Parent Shorthand Notations
319~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8779351d 320Three other shorthands exist, particularly useful for merge commits,
391a3c70 321for naming a set that is formed by a commit and its parent commits.
5a8f3117 322
391a3c70
PO
323The 'r1{caret}@' notation means all parents of 'r1'.
324
59841a39
PO
325The 'r1{caret}!' notation includes commit 'r1' but excludes all of its parents.
326By itself, this notation denotes the single commit 'r1'.
391a3c70 327
d86d2074 328The '<rev>{caret}-[<n>]' notation includes '<rev>' but excludes the <n>th
8779351d
VN
329parent (i.e. a shorthand for '<rev>{caret}<n>..<rev>'), with '<n>' = 1 if
330not given. This is typically useful for merge commits where you
331can just pass '<commit>{caret}-' to get all the commits in the branch
332that was merged in merge commit '<commit>' (including '<commit>'
333itself).
334
39b4d85e 335While '<rev>{caret}<n>' was about specifying a single commit parent, these
8779351d 336three notations also consider its parents. For example you can say
39b4d85e 337'HEAD{caret}2{caret}@', however you cannot say 'HEAD{caret}@{caret}2'.
5a8f3117 338
391a3c70
PO
339Revision Range Summary
340----------------------
ca5ee2d1
JH
341
342'<rev>'::
1afe13b9
PO
343 Include commits that are reachable from <rev> (i.e. <rev> and its
344 ancestors).
ca5ee2d1
JH
345
346'{caret}<rev>'::
1afe13b9
PO
347 Exclude commits that are reachable from <rev> (i.e. <rev> and its
348 ancestors).
ca5ee2d1
JH
349
350'<rev1>..<rev2>'::
351 Include commits that are reachable from <rev2> but exclude
3a4dc486 352 those that are reachable from <rev1>. When either <rev1> or
661c3e9b 353 <rev2> is omitted, it defaults to `HEAD`.
ca5ee2d1
JH
354
355'<rev1>\...<rev2>'::
356 Include commits that are reachable from either <rev1> or
3a4dc486 357 <rev2> but exclude those that are reachable from both. When
661c3e9b 358 either <rev1> or <rev2> is omitted, it defaults to `HEAD`.
ca5ee2d1
JH
359
360'<rev>{caret}@', e.g. 'HEAD{caret}@'::
361 A suffix '{caret}' followed by an at sign is the same as listing
362 all parents of '<rev>' (meaning, include anything reachable from
363 its parents, but not the commit itself).
364
365'<rev>{caret}!', e.g. 'HEAD{caret}!'::
366 A suffix '{caret}' followed by an exclamation mark is the same
9f91da75 367 as giving commit '<rev>' and all its parents prefixed with
ca5ee2d1
JH
368 '{caret}' to exclude them (and their ancestors).
369
733e064d 370'<rev>{caret}-<n>', e.g. 'HEAD{caret}-, HEAD{caret}-2'::
8779351d
VN
371 Equivalent to '<rev>{caret}<n>..<rev>', with '<n>' = 1 if not
372 given.
373
7a5370e6
PO
374Here are a handful of examples using the Loeliger illustration above,
375with each step in the notation's expansion and selection carefully
376spelt out:
5a8f3117 377
37980505 378....
7a5370e6 379 Args Expanded arguments Selected commits
a117be4d
PO
380 D G H D
381 D F G H I J D F
382 ^G D H D
383 ^D B E I J F B
384 ^D B C E I J F B C
385 C I J F C
7a5370e6
PO
386 B..C = ^B C C
387 B...C = B ^F C G H D E B C
8779351d
VN
388 B^- = B^..B
389 = ^B^1 B E I J F B
7a5370e6
PO
390 C^@ = C^1
391 = F I J F
392 B^@ = B^1 B^2 B^3
393 = D E F D G H E F I J
394 C^! = C ^C^@
395 = C ^C^1
396 = C ^F C
397 B^! = B ^B^@
398 = B ^B^1 ^B^2 ^B^3
399 = B ^D ^E ^F B
400 F^! D = F ^I ^J D G H D F
37980505 401....