1GITREVISIONS(7)                   Git Manual                   GITREVISIONS(7)
2
3
4

NAME

6       gitrevisions - Specifying revisions and ranges for Git
7

SYNOPSIS

9       gitrevisions
10

DESCRIPTION

12       Many Git commands take revision parameters as arguments. Depending on
13       the command, they denote a specific commit or, for commands which walk
14       the revision graph (such as git-log(1)), all commits which are
15       reachable from that commit. For commands that walk the revision graph
16       one can also specify a range of revisions explicitly.
17
18       In addition, some Git commands (such as git-show(1) and git-push(1))
19       can also take revision parameters which denote other objects than
20       commits, e.g. blobs ("files") or trees ("directories of files").
21

SPECIFYING REVISIONS

23       A revision parameter <rev> typically, but not necessarily, names a
24       commit object. It uses what is called an extended SHA-1 syntax. Here
25       are various ways to spell object names. The ones listed near the end of
26       this list name trees and blobs contained in a commit.
27
28           Note
29           This document shows the "raw" syntax as seen by git. The shell and
30           other UIs might require additional quoting to protect special
31           characters and to avoid word splitting.
32
33       <sha1>, e.g. dae86e1950b1277e545cee180551750029cfe735, dae86e
34           The full SHA-1 object name (40-byte hexadecimal string), or a
35           leading substring that is unique within the repository. E.g.
36           dae86e1950b1277e545cee180551750029cfe735 and dae86e both name the
37           same commit object if there is no other object in your repository
38           whose object name starts with dae86e.
39
40       <describeOutput>, e.g. v1.7.4.2-679-g3bee7fb
41           Output from git describe; i.e. a closest tag, optionally followed
42           by a dash and a number of commits, followed by a dash, a g, and an
43           abbreviated object name.
44
45       <refname>, e.g. master, heads/master, refs/heads/master
46           A symbolic ref name. E.g.  master typically means the commit object
47           referenced by refs/heads/master. If you happen to have both
48           heads/master and tags/master, you can explicitly say heads/master
49           to tell Git which one you mean. When ambiguous, a <refname> is
50           disambiguated by taking the first match in the following rules:
51
52            1. If $GIT_DIR/<refname> exists, that is what you mean (this is
53               usually useful only for HEAD, FETCH_HEAD, ORIG_HEAD,
54               MERGE_HEAD, REBASE_HEAD, REVERT_HEAD, CHERRY_PICK_HEAD,
55               BISECT_HEAD and AUTO_MERGE);
56
57            2. otherwise, refs/<refname> if it exists;
58
59            3. otherwise, refs/tags/<refname> if it exists;
60
61            4. otherwise, refs/heads/<refname> if it exists;
62
63            5. otherwise, refs/remotes/<refname> if it exists;
64
65            6. otherwise, refs/remotes/<refname>/HEAD if it exists.
66
67               HEAD
68                   names the commit on which you based the changes in the
69                   working tree.
70
71               FETCH_HEAD
72                   records the branch which you fetched from a remote
73                   repository with your last git fetch invocation.
74
75               ORIG_HEAD
76                   is created by commands that move your HEAD in a drastic way
77                   (git am, git merge, git rebase, git reset), to record the
78                   position of the HEAD before their operation, so that you
79                   can easily change the tip of the branch back to the state
80                   before you ran them.
81
82               MERGE_HEAD
83                   records the commit(s) which you are merging into your
84                   branch when you run git merge.
85
86               REBASE_HEAD
87                   during a rebase, records the commit at which the operation
88                   is currently stopped, either because of conflicts or an
89                   edit command in an interactive rebase.
90
91               REVERT_HEAD
92                   records the commit which you are reverting when you run git
93                   revert.
94
95               CHERRY_PICK_HEAD
96                   records the commit which you are cherry-picking when you
97                   run git cherry-pick.
98
99               BISECT_HEAD
100                   records the current commit to be tested when you run git
101                   bisect --no-checkout.
102
103               AUTO_MERGE
104                   records a tree object corresponding to the state the ort
105                   merge strategy wrote to the working tree when a merge
106                   operation resulted in conflicts.
107
108           Note that any of the refs/* cases above may come either from the
109           $GIT_DIR/refs directory or from the $GIT_DIR/packed-refs file.
110           While the ref name encoding is unspecified, UTF-8 is preferred as
111           some output processing may assume ref names in UTF-8.
112
113       @
114           @ alone is a shortcut for HEAD.
115
116       [<refname>]@{<date>}, e.g. master@{yesterday}, HEAD@{5 minutes ago}
117           A ref followed by the suffix @ with a date specification enclosed
118           in a brace pair (e.g.  {yesterday}, {1 month 2 weeks 3 days 1 hour
119           1 second ago} or {1979-02-26 18:30:00}) specifies the value of the
120           ref at a prior point in time. This suffix may only be used
121           immediately following a ref name and the ref must have an existing
122           log ($GIT_DIR/logs/<ref>). Note that this looks up the state of
123           your local ref at a given time; e.g., what was in your local master
124           branch last week. If you want to look at commits made during
125           certain times, see --since and --until.
126
127       <refname>@{<n>}, e.g. master@{1}
128           A ref followed by the suffix @ with an ordinal specification
129           enclosed in a brace pair (e.g.  {1}, {15}) specifies the n-th prior
130           value of that ref. For example master@{1} is the immediate prior
131           value of master while master@{5} is the 5th prior value of master.
132           This suffix may only be used immediately following a ref name and
133           the ref must have an existing log ($GIT_DIR/logs/<refname>).
134
135       @{<n>}, e.g. @{1}
136           You can use the @ construct with an empty ref part to get at a
137           reflog entry of the current branch. For example, if you are on
138           branch blabla then @{1} means the same as blabla@{1}.
139
140       @{-<n>}, e.g. @{-1}
141           The construct @{-<n>} means the <n>th branch/commit checked out
142           before the current one.
143
144       [<branchname>]@{upstream}, e.g. master@{upstream}, @{u}
145           A branch B may be set up to build on top of a branch X (configured
146           with branch.<name>.merge) at a remote R (configured with
147           branch.<name>.remote). B@{u} refers to the remote-tracking branch
148           for the branch X taken from remote R, typically found at
149           refs/remotes/R/X.
150
151       [<branchname>]@{push}, e.g. master@{push}, @{push}
152           The suffix @{push} reports the branch "where we would push to" if
153           git push were run while branchname was checked out (or the current
154           HEAD if no branchname is specified). Like for @{upstream}, we
155           report the remote-tracking branch that corresponds to that branch
156           at the remote.
157
158           Here’s an example to make it more clear:
159
160               $ git config push.default current
161               $ git config remote.pushdefault myfork
162               $ git switch -c mybranch origin/master
163
164               $ git rev-parse --symbolic-full-name @{upstream}
165               refs/remotes/origin/master
166
167               $ git rev-parse --symbolic-full-name @{push}
168               refs/remotes/myfork/mybranch
169
170           Note in the example that we set up a triangular workflow, where we
171           pull from one location and push to another. In a non-triangular
172           workflow, @{push} is the same as @{upstream}, and there is no need
173           for it.
174
175           This suffix is also accepted when spelled in uppercase, and means
176           the same thing no matter the case.
177
178       <rev>^[<n>], e.g. HEAD^, v1.5.1^0
179           A suffix ^ to a revision parameter means the first parent of that
180           commit object.  ^<n> means the <n>th parent (i.e.  <rev>^ is
181           equivalent to <rev>^1). As a special rule, <rev>^0 means the commit
182           itself and is used when <rev> is the object name of a tag object
183           that refers to a commit object.
184
185       <rev>~[<n>], e.g. HEAD~, master~3
186           A suffix ~ to a revision parameter means the first parent of that
187           commit object. A suffix ~<n> to a revision parameter means the
188           commit object that is the <n>th generation ancestor of the named
189           commit object, following only the first parents. I.e.  <rev>~3 is
190           equivalent to <rev>^^^ which is equivalent to <rev>^1^1^1. See
191           below for an illustration of the usage of this form.
192
193       <rev>^{<type>}, e.g. v0.99.8^{commit}
194           A suffix ^ followed by an object type name enclosed in brace pair
195           means dereference the object at <rev> recursively until an object
196           of type <type> is found or the object cannot be dereferenced
197           anymore (in which case, barf). For example, if <rev> is a
198           commit-ish, <rev>^{commit} describes the corresponding commit
199           object. Similarly, if <rev> is a tree-ish, <rev>^{tree} describes
200           the corresponding tree object.  <rev>^0 is a short-hand for
201           <rev>^{commit}.
202
203           <rev>^{object} can be used to make sure <rev> names an object that
204           exists, without requiring <rev> to be a tag, and without
205           dereferencing <rev>; because a tag is already an object, it does
206           not have to be dereferenced even once to get to an object.
207
208           <rev>^{tag} can be used to ensure that <rev> identifies an existing
209           tag object.
210
211       <rev>^{}, e.g. v0.99.8^{}
212           A suffix ^ followed by an empty brace pair means the object could
213           be a tag, and dereference the tag recursively until a non-tag
214           object is found.
215
216       <rev>^{/<text>}, e.g. HEAD^{/fix nasty bug}
217           A suffix ^ to a revision parameter, followed by a brace pair that
218           contains a text led by a slash, is the same as the :/fix nasty bug
219           syntax below except that it returns the youngest matching commit
220           which is reachable from the <rev> before ^.
221
222       :/<text>, e.g. :/fix nasty bug
223           A colon, followed by a slash, followed by a text, names a commit
224           whose commit message matches the specified regular expression. This
225           name returns the youngest matching commit which is reachable from
226           any ref, including HEAD. The regular expression can match any part
227           of the commit message. To match messages starting with a string,
228           one can use e.g.  :/^foo. The special sequence :/!  is reserved for
229           modifiers to what is matched.  :/!-foo performs a negative match,
230           while :/!!foo matches a literal !  character, followed by foo. Any
231           other sequence beginning with :/!  is reserved for now. Depending
232           on the given text, the shell’s word splitting rules might require
233           additional quoting.
234
235       <rev>:<path>, e.g. HEAD:README, master:./README
236           A suffix : followed by a path names the blob or tree at the given
237           path in the tree-ish object named by the part before the colon. A
238           path starting with ./ or ../ is relative to the current working
239           directory. The given path will be converted to be relative to the
240           working tree’s root directory. This is most useful to address a
241           blob or tree from a commit or tree that has the same tree structure
242           as the working tree.
243
244       :[<n>:]<path>, e.g. :0:README, :README
245           A colon, optionally followed by a stage number (0 to 3) and a
246           colon, followed by a path, names a blob object in the index at the
247           given path. A missing stage number (and the colon that follows it)
248           names a stage 0 entry. During a merge, stage 1 is the common
249           ancestor, stage 2 is the target branch’s version (typically the
250           current branch), and stage 3 is the version from the branch which
251           is being merged.
252
253       Here is an illustration, by Jon Loeliger. Both commit nodes B and C are
254       parents of commit node A. Parent commits are ordered left-to-right.
255
256           G   H   I   J
257            \ /     \ /
258             D   E   F
259              \  |  / \
260               \ | /   |
261                \|/    |
262                 B     C
263                  \   /
264                   \ /
265                    A
266
267           A =      = A^0
268           B = A^   = A^1     = A~1
269           C =      = A^2
270           D = A^^  = A^1^1   = A~2
271           E = B^2  = A^^2
272           F = B^3  = A^^3
273           G = A^^^ = A^1^1^1 = A~3
274           H = D^2  = B^^2    = A^^^2  = A~2^2
275           I = F^   = B^3^    = A^^3^
276           J = F^2  = B^3^2   = A^^3^2
277

SPECIFYING RANGES

279       History traversing commands such as git log operate on a set of
280       commits, not just a single commit.
281
282       For these commands, specifying a single revision, using the notation
283       described in the previous section, means the set of commits reachable
284       from the given commit.
285
286       Specifying several revisions means the set of commits reachable from
287       any of the given commits.
288
289       A commit’s reachable set is the commit itself and the commits in its
290       ancestry chain.
291
292       There are several notations to specify a set of connected commits
293       (called a "revision range"), illustrated below.
294
295   Commit Exclusions
296       ^<rev> (caret) Notation
297           To exclude commits reachable from a commit, a prefix ^ notation is
298           used. E.g.  ^r1 r2 means commits reachable from r2 but exclude the
299           ones reachable from r1 (i.e.  r1 and its ancestors).
300
301   Dotted Range Notations
302       The .. (two-dot) Range Notation
303           The ^r1 r2 set operation appears so often that there is a shorthand
304           for it. When you have two commits r1 and r2 (named according to the
305           syntax explained in SPECIFYING REVISIONS above), you can ask for
306           commits that are reachable from r2 excluding those that are
307           reachable from r1 by ^r1 r2 and it can be written as r1..r2.
308
309       The ... (three-dot) Symmetric Difference Notation
310           A similar notation r1...r2 is called symmetric difference of r1 and
311           r2 and is defined as r1 r2 --not $(git merge-base --all r1 r2). It
312           is the set of commits that are reachable from either one of r1
313           (left side) or r2 (right side) but not from both.
314
315       In these two shorthand notations, you can omit one end and let it
316       default to HEAD. For example, origin.. is a shorthand for origin..HEAD
317       and asks "What did I do since I forked from the origin branch?"
318       Similarly, ..origin is a shorthand for HEAD..origin and asks "What did
319       the origin do since I forked from them?" Note that .. would mean
320       HEAD..HEAD which is an empty range that is both reachable and
321       unreachable from HEAD.
322
323       Commands that are specifically designed to take two distinct ranges
324       (e.g. "git range-diff R1 R2" to compare two ranges) do exist, but they
325       are exceptions. Unless otherwise noted, all "git" commands that operate
326       on a set of commits work on a single revision range. In other words,
327       writing two "two-dot range notation" next to each other, e.g.
328
329           $ git log A..B C..D
330
331       does not specify two revision ranges for most commands. Instead it will
332       name a single connected set of commits, i.e. those that are reachable
333       from either B or D but are reachable from neither A or C. In a linear
334       history like this:
335
336           ---A---B---o---o---C---D
337
338       because A and B are reachable from C, the revision range specified by
339       these two dotted ranges is a single commit D.
340
341   Other <rev>^ Parent Shorthand Notations
342       Three other shorthands exist, particularly useful for merge commits,
343       for naming a set that is formed by a commit and its parent commits.
344
345       The r1^@ notation means all parents of r1.
346
347       The r1^! notation includes commit r1 but excludes all of its parents.
348       By itself, this notation denotes the single commit r1.
349
350       The <rev>^-[<n>] notation includes <rev> but excludes the <n>th parent
351       (i.e. a shorthand for <rev>^<n>..<rev>), with <n> = 1 if not given.
352       This is typically useful for merge commits where you can just pass
353       <commit>^- to get all the commits in the branch that was merged in
354       merge commit <commit> (including <commit> itself).
355
356       While <rev>^<n> was about specifying a single commit parent, these
357       three notations also consider its parents. For example you can say
358       HEAD^2^@, however you cannot say HEAD^@^2.
359

REVISION RANGE SUMMARY

361       <rev>
362           Include commits that are reachable from <rev> (i.e. <rev> and its
363           ancestors).
364
365       ^<rev>
366           Exclude commits that are reachable from <rev> (i.e. <rev> and its
367           ancestors).
368
369       <rev1>..<rev2>
370           Include commits that are reachable from <rev2> but exclude those
371           that are reachable from <rev1>. When either <rev1> or <rev2> is
372           omitted, it defaults to HEAD.
373
374       <rev1>...<rev2>
375           Include commits that are reachable from either <rev1> or <rev2> but
376           exclude those that are reachable from both. When either <rev1> or
377           <rev2> is omitted, it defaults to HEAD.
378
379       <rev>^@, e.g. HEAD^@
380           A suffix ^ followed by an at sign is the same as listing all
381           parents of <rev> (meaning, include anything reachable from its
382           parents, but not the commit itself).
383
384       <rev>^!, e.g. HEAD^!
385           A suffix ^ followed by an exclamation mark is the same as giving
386           commit <rev> and all its parents prefixed with ^ to exclude them
387           (and their ancestors).
388
389       <rev>^-<n>, e.g. HEAD^-, HEAD^-2
390           Equivalent to <rev>^<n>..<rev>, with <n> = 1 if not given.
391
392       Here are a handful of examples using the Loeliger illustration above,
393       with each step in the notation’s expansion and selection carefully
394       spelt out:
395
396              Args   Expanded arguments    Selected commits
397              D                            G H D
398              D F                          G H I J D F
399              ^G D                         H D
400              ^D B                         E I J F B
401              ^D B C                       E I J F B C
402              C                            I J F C
403              B..C   = ^B C                C
404              B...C  = B ^F C              G H D E B C
405              B^-    = B^..B
406                     = ^B^1 B              E I J F B
407              C^@    = C^1
408                     = F                   I J F
409              B^@    = B^1 B^2 B^3
410                     = D E F               D G H E F I J
411              C^!    = C ^C^@
412                     = C ^C^1
413                     = C ^F                C
414              B^!    = B ^B^@
415                     = B ^B^1 ^B^2 ^B^3
416                     = B ^D ^E ^F          B
417              F^! D  = F ^I ^J D           G H D F
418

SEE ALSO

420       git-rev-parse(1)
421

GIT

423       Part of the git(1) suite
424
425
426
427Git 2.43.0                        11/20/2023                   GITREVISIONS(7)
Impressum