1GIT-REV-PARSE(1)                  Git Manual                  GIT-REV-PARSE(1)
2
3
4

NAME

6       git-rev-parse - Pick out and massage parameters
7

SYNOPSIS

9       git rev-parse [<options>] <args>...
10

DESCRIPTION

12       Many Git porcelainish commands take mixture of flags (i.e. parameters
13       that begin with a dash -) and parameters meant for the underlying git
14       rev-list command they use internally and flags and parameters for the
15       other commands they use downstream of git rev-list. This command is
16       used to distinguish between them.
17

OPTIONS

19   Operation Modes
20       Each of these options must appear first on the command line.
21
22       --parseopt
23           Use git rev-parse in option parsing mode (see PARSEOPT section
24           below).
25
26       --sq-quote
27           Use git rev-parse in shell quoting mode (see SQ-QUOTE section
28           below). In contrast to the --sq option below, this mode does only
29           quoting. Nothing else is done to command input.
30
31   Options for --parseopt
32       --keep-dashdash
33           Only meaningful in --parseopt mode. Tells the option parser to echo
34           out the first -- met instead of skipping it.
35
36       --stop-at-non-option
37           Only meaningful in --parseopt mode. Lets the option parser stop at
38           the first non-option argument. This can be used to parse
39           sub-commands that take options themselves.
40
41       --stuck-long
42           Only meaningful in --parseopt mode. Output the options in their
43           long form if available, and with their arguments stuck.
44
45   Options for Filtering
46       --revs-only
47           Do not output flags and parameters not meant for git rev-list
48           command.
49
50       --no-revs
51           Do not output flags and parameters meant for git rev-list command.
52
53       --flags
54           Do not output non-flag parameters.
55
56       --no-flags
57           Do not output flag parameters.
58
59   Options for Output
60       --default <arg>
61           If there is no parameter given by the user, use <arg> instead.
62
63       --prefix <arg>
64           Behave as if git rev-parse was invoked from the <arg> subdirectory
65           of the working tree. Any relative filenames are resolved as if they
66           are prefixed by <arg> and will be printed in that form.
67
68           This can be used to convert arguments to a command run in a
69           subdirectory so that they can still be used after moving to the
70           top-level of the repository. For example:
71
72               prefix=$(git rev-parse --show-prefix)
73               cd "$(git rev-parse --show-toplevel)"
74               # rev-parse provides the -- needed for 'set'
75               eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
76
77       --verify
78           Verify that exactly one parameter is provided, and that it can be
79           turned into a raw 20-byte SHA-1 that can be used to access the
80           object database. If so, emit it to the standard output; otherwise,
81           error out.
82
83           If you want to make sure that the output actually names an object
84           in your object database and/or can be used as a specific type of
85           object you require, you can add the ^{type} peeling operator to the
86           parameter. For example, git rev-parse "$VAR^{commit}" will make
87           sure $VAR names an existing object that is a commit-ish (i.e. a
88           commit, or an annotated tag that points at a commit). To make sure
89           that $VAR names an existing object of any type, git rev-parse
90           "$VAR^{object}" can be used.
91
92           Note that if you are verifying a name from an untrusted source, it
93           is wise to use --end-of-options so that the name argument is not
94           mistaken for another option.
95
96       -q, --quiet
97           Only meaningful in --verify mode. Do not output an error message if
98           the first argument is not a valid object name; instead exit with
99           non-zero status silently. SHA-1s for valid object names are printed
100           to stdout on success.
101
102       --sq
103           Usually the output is made one line per flag and parameter. This
104           option makes output a single line, properly quoted for consumption
105           by shell. Useful when you expect your parameter to contain
106           whitespaces and newlines (e.g. when using pickaxe -S with git
107           diff-*). In contrast to the --sq-quote option, the command input is
108           still interpreted as usual.
109
110       --short[=length]
111           Same as --verify but shortens the object name to a unique prefix
112           with at least length characters. The minimum length is 4, the
113           default is the effective value of the core.abbrev configuration
114           variable (see git-config(1)).
115
116       --not
117           When showing object names, prefix them with ^ and strip ^ prefix
118           from the object names that already have one.
119
120       --abbrev-ref[=(strict|loose)]
121           A non-ambiguous short name of the objects name. The option
122           core.warnAmbiguousRefs is used to select the strict abbreviation
123           mode.
124
125       --symbolic
126           Usually the object names are output in SHA-1 form (with possible ^
127           prefix); this option makes them output in a form as close to the
128           original input as possible.
129
130       --symbolic-full-name
131           This is similar to --symbolic, but it omits input that are not refs
132           (i.e. branch or tag names; or more explicitly disambiguating
133           "heads/master" form, when you want to name the "master" branch when
134           there is an unfortunately named tag "master"), and show them as
135           full refnames (e.g. "refs/heads/master").
136
137   Options for Objects
138       --all
139           Show all refs found in refs/.
140
141       --branches[=pattern], --tags[=pattern], --remotes[=pattern]
142           Show all branches, tags, or remote-tracking branches, respectively
143           (i.e., refs found in refs/heads, refs/tags, or refs/remotes,
144           respectively).
145
146           If a pattern is given, only refs matching the given shell glob are
147           shown. If the pattern does not contain a globbing character (?, *,
148           or [), it is turned into a prefix match by appending /*.
149
150       --glob=pattern
151           Show all refs matching the shell glob pattern pattern. If the
152           pattern does not start with refs/, this is automatically prepended.
153           If the pattern does not contain a globbing character (?, *, or [),
154           it is turned into a prefix match by appending /*.
155
156       --exclude=<glob-pattern>
157           Do not include refs matching <glob-pattern> that the next --all,
158           --branches, --tags, --remotes, or --glob would otherwise consider.
159           Repetitions of this option accumulate exclusion patterns up to the
160           next --all, --branches, --tags, --remotes, or --glob option (other
161           options or arguments do not clear accumulated patterns).
162
163           The patterns given should not begin with refs/heads, refs/tags, or
164           refs/remotes when applied to --branches, --tags, or --remotes,
165           respectively, and they must begin with refs/ when applied to --glob
166           or --all. If a trailing /* is intended, it must be given
167           explicitly.
168
169       --exclude-hidden=[receive|uploadpack]
170           Do not include refs that would be hidden by git-receive-pack or
171           git-upload-pack by consulting the appropriate receive.hideRefs or
172           uploadpack.hideRefs configuration along with transfer.hideRefs (see
173           git-config(1)). This option affects the next pseudo-ref option
174           --all or --glob and is cleared after processing them.
175
176       --disambiguate=<prefix>
177           Show every object whose name begins with the given prefix. The
178           <prefix> must be at least 4 hexadecimal digits long to avoid
179           listing each and every object in the repository by mistake.
180
181   Options for Files
182       --local-env-vars
183           List the GIT_* environment variables that are local to the
184           repository (e.g. GIT_DIR or GIT_WORK_TREE, but not GIT_EDITOR).
185           Only the names of the variables are listed, not their value, even
186           if they are set.
187
188       --path-format=(absolute|relative)
189           Controls the behavior of certain other options. If specified as
190           absolute, the paths printed by those options will be absolute and
191           canonical. If specified as relative, the paths will be relative to
192           the current working directory if that is possible. The default is
193           option specific.
194
195           This option may be specified multiple times and affects only the
196           arguments that follow it on the command line, either to the end of
197           the command line or the next instance of this option.
198
199       The following options are modified by --path-format:
200
201       --git-dir
202           Show $GIT_DIR if defined. Otherwise show the path to the .git
203           directory. The path shown, when relative, is relative to the
204           current working directory.
205
206           If $GIT_DIR is not defined and the current directory is not
207           detected to lie in a Git repository or work tree print a message to
208           stderr and exit with nonzero status.
209
210       --git-common-dir
211           Show $GIT_COMMON_DIR if defined, else $GIT_DIR.
212
213       --resolve-git-dir <path>
214           Check if <path> is a valid repository or a gitfile that points at a
215           valid repository, and print the location of the repository. If
216           <path> is a gitfile then the resolved path to the real repository
217           is printed.
218
219       --git-path <path>
220           Resolve "$GIT_DIR/<path>" and takes other path relocation variables
221           such as $GIT_OBJECT_DIRECTORY, $GIT_INDEX_FILE... into account. For
222           example, if $GIT_OBJECT_DIRECTORY is set to /foo/bar then "git
223           rev-parse --git-path objects/abc" returns /foo/bar/abc.
224
225       --show-toplevel
226           Show the (by default, absolute) path of the top-level directory of
227           the working tree. If there is no working tree, report an error.
228
229       --show-superproject-working-tree
230           Show the absolute path of the root of the superproject’s working
231           tree (if exists) that uses the current repository as its submodule.
232           Outputs nothing if the current repository is not used as a
233           submodule by any project.
234
235       --shared-index-path
236           Show the path to the shared index file in split index mode, or
237           empty if not in split-index mode.
238
239       The following options are unaffected by --path-format:
240
241       --absolute-git-dir
242           Like --git-dir, but its output is always the canonicalized absolute
243           path.
244
245       --is-inside-git-dir
246           When the current working directory is below the repository
247           directory print "true", otherwise "false".
248
249       --is-inside-work-tree
250           When the current working directory is inside the work tree of the
251           repository print "true", otherwise "false".
252
253       --is-bare-repository
254           When the repository is bare print "true", otherwise "false".
255
256       --is-shallow-repository
257           When the repository is shallow print "true", otherwise "false".
258
259       --show-cdup
260           When the command is invoked from a subdirectory, show the path of
261           the top-level directory relative to the current directory
262           (typically a sequence of "../", or an empty string).
263
264       --show-prefix
265           When the command is invoked from a subdirectory, show the path of
266           the current directory relative to the top-level directory.
267
268       --show-object-format[=(storage|input|output)]
269           Show the object format (hash algorithm) used for the repository for
270           storage inside the .git directory, input, or output. For input,
271           multiple algorithms may be printed, space-separated. If not
272           specified, the default is "storage".
273
274   Other Options
275       --since=datestring, --after=datestring
276           Parse the date string, and output the corresponding --max-age=
277           parameter for git rev-list.
278
279       --until=datestring, --before=datestring
280           Parse the date string, and output the corresponding --min-age=
281           parameter for git rev-list.
282
283       <args>...
284           Flags and parameters to be parsed.
285

SPECIFYING REVISIONS

287       A revision parameter <rev> typically, but not necessarily, names a
288       commit object. It uses what is called an extended SHA-1 syntax. Here
289       are various ways to spell object names. The ones listed near the end of
290       this list name trees and blobs contained in a commit.
291
292           Note
293           This document shows the "raw" syntax as seen by git. The shell and
294           other UIs might require additional quoting to protect special
295           characters and to avoid word splitting.
296
297       <sha1>, e.g. dae86e1950b1277e545cee180551750029cfe735, dae86e
298           The full SHA-1 object name (40-byte hexadecimal string), or a
299           leading substring that is unique within the repository. E.g.
300           dae86e1950b1277e545cee180551750029cfe735 and dae86e both name the
301           same commit object if there is no other object in your repository
302           whose object name starts with dae86e.
303
304       <describeOutput>, e.g. v1.7.4.2-679-g3bee7fb
305           Output from git describe; i.e. a closest tag, optionally followed
306           by a dash and a number of commits, followed by a dash, a g, and an
307           abbreviated object name.
308
309       <refname>, e.g. master, heads/master, refs/heads/master
310           A symbolic ref name. E.g.  master typically means the commit object
311           referenced by refs/heads/master. If you happen to have both
312           heads/master and tags/master, you can explicitly say heads/master
313           to tell Git which one you mean. When ambiguous, a <refname> is
314           disambiguated by taking the first match in the following rules:
315
316            1. If $GIT_DIR/<refname> exists, that is what you mean (this is
317               usually useful only for HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEAD
318               and CHERRY_PICK_HEAD);
319
320            2. otherwise, refs/<refname> if it exists;
321
322            3. otherwise, refs/tags/<refname> if it exists;
323
324            4. otherwise, refs/heads/<refname> if it exists;
325
326            5. otherwise, refs/remotes/<refname> if it exists;
327
328            6. otherwise, refs/remotes/<refname>/HEAD if it exists.
329
330               HEAD names the commit on which you based the changes in the
331               working tree.  FETCH_HEAD records the branch which you fetched
332               from a remote repository with your last git fetch invocation.
333               ORIG_HEAD is created by commands that move your HEAD in a
334               drastic way, to record the position of the HEAD before their
335               operation, so that you can easily change the tip of the branch
336               back to the state before you ran them.  MERGE_HEAD records the
337               commit(s) which you are merging into your branch when you run
338               git merge.  CHERRY_PICK_HEAD records the commit which you are
339               cherry-picking when you run git cherry-pick.
340
341               Note that any of the refs/* cases above may come either from
342               the $GIT_DIR/refs directory or from the $GIT_DIR/packed-refs
343               file. While the ref name encoding is unspecified, UTF-8 is
344               preferred as some output processing may assume ref names in
345               UTF-8.
346
347       @
348           @ alone is a shortcut for HEAD.
349
350       [<refname>]@{<date>}, e.g. master@{yesterday}, HEAD@{5 minutes ago}
351           A ref followed by the suffix @ with a date specification enclosed
352           in a brace pair (e.g.  {yesterday}, {1 month 2 weeks 3 days 1 hour
353           1 second ago} or {1979-02-26 18:30:00}) specifies the value of the
354           ref at a prior point in time. This suffix may only be used
355           immediately following a ref name and the ref must have an existing
356           log ($GIT_DIR/logs/<ref>). Note that this looks up the state of
357           your local ref at a given time; e.g., what was in your local master
358           branch last week. If you want to look at commits made during
359           certain times, see --since and --until.
360
361       <refname>@{<n>}, e.g. master@{1}
362           A ref followed by the suffix @ with an ordinal specification
363           enclosed in a brace pair (e.g.  {1}, {15}) specifies the n-th prior
364           value of that ref. For example master@{1} is the immediate prior
365           value of master while master@{5} is the 5th prior value of master.
366           This suffix may only be used immediately following a ref name and
367           the ref must have an existing log ($GIT_DIR/logs/<refname>).
368
369       @{<n>}, e.g. @{1}
370           You can use the @ construct with an empty ref part to get at a
371           reflog entry of the current branch. For example, if you are on
372           branch blabla then @{1} means the same as blabla@{1}.
373
374       @{-<n>}, e.g. @{-1}
375           The construct @{-<n>} means the <n>th branch/commit checked out
376           before the current one.
377
378       [<branchname>]@{upstream}, e.g. master@{upstream}, @{u}
379           A branch B may be set up to build on top of a branch X (configured
380           with branch.<name>.merge) at a remote R (configured with
381           branch.<name>.remote). B@{u} refers to the remote-tracking branch
382           for the branch X taken from remote R, typically found at
383           refs/remotes/R/X.
384
385       [<branchname>]@{push}, e.g. master@{push}, @{push}
386           The suffix @{push} reports the branch "where we would push to" if
387           git push were run while branchname was checked out (or the current
388           HEAD if no branchname is specified). Like for @{upstream}, we
389           report the remote-tracking branch that corresponds to that branch
390           at the remote.
391
392           Here’s an example to make it more clear:
393
394               $ git config push.default current
395               $ git config remote.pushdefault myfork
396               $ git switch -c mybranch origin/master
397
398               $ git rev-parse --symbolic-full-name @{upstream}
399               refs/remotes/origin/master
400
401               $ git rev-parse --symbolic-full-name @{push}
402               refs/remotes/myfork/mybranch
403
404           Note in the example that we set up a triangular workflow, where we
405           pull from one location and push to another. In a non-triangular
406           workflow, @{push} is the same as @{upstream}, and there is no need
407           for it.
408
409           This suffix is also accepted when spelled in uppercase, and means
410           the same thing no matter the case.
411
412       <rev>^[<n>], e.g. HEAD^, v1.5.1^0
413           A suffix ^ to a revision parameter means the first parent of that
414           commit object.  ^<n> means the <n>th parent (i.e.  <rev>^ is
415           equivalent to <rev>^1). As a special rule, <rev>^0 means the commit
416           itself and is used when <rev> is the object name of a tag object
417           that refers to a commit object.
418
419       <rev>~[<n>], e.g. HEAD~, master~3
420           A suffix ~ to a revision parameter means the first parent of that
421           commit object. A suffix ~<n> to a revision parameter means the
422           commit object that is the <n>th generation ancestor of the named
423           commit object, following only the first parents. I.e.  <rev>~3 is
424           equivalent to <rev>^^^ which is equivalent to <rev>^1^1^1. See
425           below for an illustration of the usage of this form.
426
427       <rev>^{<type>}, e.g. v0.99.8^{commit}
428           A suffix ^ followed by an object type name enclosed in brace pair
429           means dereference the object at <rev> recursively until an object
430           of type <type> is found or the object cannot be dereferenced
431           anymore (in which case, barf). For example, if <rev> is a
432           commit-ish, <rev>^{commit} describes the corresponding commit
433           object. Similarly, if <rev> is a tree-ish, <rev>^{tree} describes
434           the corresponding tree object.  <rev>^0 is a short-hand for
435           <rev>^{commit}.
436
437           <rev>^{object} can be used to make sure <rev> names an object that
438           exists, without requiring <rev> to be a tag, and without
439           dereferencing <rev>; because a tag is already an object, it does
440           not have to be dereferenced even once to get to an object.
441
442           <rev>^{tag} can be used to ensure that <rev> identifies an existing
443           tag object.
444
445       <rev>^{}, e.g. v0.99.8^{}
446           A suffix ^ followed by an empty brace pair means the object could
447           be a tag, and dereference the tag recursively until a non-tag
448           object is found.
449
450       <rev>^{/<text>}, e.g. HEAD^{/fix nasty bug}
451           A suffix ^ to a revision parameter, followed by a brace pair that
452           contains a text led by a slash, is the same as the :/fix nasty bug
453           syntax below except that it returns the youngest matching commit
454           which is reachable from the <rev> before ^.
455
456       :/<text>, e.g. :/fix nasty bug
457           A colon, followed by a slash, followed by a text, names a commit
458           whose commit message matches the specified regular expression. This
459           name returns the youngest matching commit which is reachable from
460           any ref, including HEAD. The regular expression can match any part
461           of the commit message. To match messages starting with a string,
462           one can use e.g.  :/^foo. The special sequence :/!  is reserved for
463           modifiers to what is matched.  :/!-foo performs a negative match,
464           while :/!!foo matches a literal !  character, followed by foo. Any
465           other sequence beginning with :/!  is reserved for now. Depending
466           on the given text, the shell’s word splitting rules might require
467           additional quoting.
468
469       <rev>:<path>, e.g. HEAD:README, master:./README
470           A suffix : followed by a path names the blob or tree at the given
471           path in the tree-ish object named by the part before the colon. A
472           path starting with ./ or ../ is relative to the current working
473           directory. The given path will be converted to be relative to the
474           working tree’s root directory. This is most useful to address a
475           blob or tree from a commit or tree that has the same tree structure
476           as the working tree.
477
478       :[<n>:]<path>, e.g. :0:README, :README
479           A colon, optionally followed by a stage number (0 to 3) and a
480           colon, followed by a path, names a blob object in the index at the
481           given path. A missing stage number (and the colon that follows it)
482           names a stage 0 entry. During a merge, stage 1 is the common
483           ancestor, stage 2 is the target branch’s version (typically the
484           current branch), and stage 3 is the version from the branch which
485           is being merged.
486
487       Here is an illustration, by Jon Loeliger. Both commit nodes B and C are
488       parents of commit node A. Parent commits are ordered left-to-right.
489
490           G   H   I   J
491            \ /     \ /
492             D   E   F
493              \  |  / \
494               \ | /   |
495                \|/    |
496                 B     C
497                  \   /
498                   \ /
499                    A
500
501           A =      = A^0
502           B = A^   = A^1     = A~1
503           C =      = A^2
504           D = A^^  = A^1^1   = A~2
505           E = B^2  = A^^2
506           F = B^3  = A^^3
507           G = A^^^ = A^1^1^1 = A~3
508           H = D^2  = B^^2    = A^^^2  = A~2^2
509           I = F^   = B^3^    = A^^3^
510           J = F^2  = B^3^2   = A^^3^2
511

SPECIFYING RANGES

513       History traversing commands such as git log operate on a set of
514       commits, not just a single commit.
515
516       For these commands, specifying a single revision, using the notation
517       described in the previous section, means the set of commits reachable
518       from the given commit.
519
520       Specifying several revisions means the set of commits reachable from
521       any of the given commits.
522
523       A commit’s reachable set is the commit itself and the commits in its
524       ancestry chain.
525
526       There are several notations to specify a set of connected commits
527       (called a "revision range"), illustrated below.
528
529   Commit Exclusions
530       ^<rev> (caret) Notation
531           To exclude commits reachable from a commit, a prefix ^ notation is
532           used. E.g.  ^r1 r2 means commits reachable from r2 but exclude the
533           ones reachable from r1 (i.e.  r1 and its ancestors).
534
535   Dotted Range Notations
536       The .. (two-dot) Range Notation
537           The ^r1 r2 set operation appears so often that there is a shorthand
538           for it. When you have two commits r1 and r2 (named according to the
539           syntax explained in SPECIFYING REVISIONS above), you can ask for
540           commits that are reachable from r2 excluding those that are
541           reachable from r1 by ^r1 r2 and it can be written as r1..r2.
542
543       The ... (three-dot) Symmetric Difference Notation
544           A similar notation r1...r2 is called symmetric difference of r1 and
545           r2 and is defined as r1 r2 --not $(git merge-base --all r1 r2). It
546           is the set of commits that are reachable from either one of r1
547           (left side) or r2 (right side) but not from both.
548
549       In these two shorthand notations, you can omit one end and let it
550       default to HEAD. For example, origin.. is a shorthand for origin..HEAD
551       and asks "What did I do since I forked from the origin branch?"
552       Similarly, ..origin is a shorthand for HEAD..origin and asks "What did
553       the origin do since I forked from them?" Note that .. would mean
554       HEAD..HEAD which is an empty range that is both reachable and
555       unreachable from HEAD.
556
557       Commands that are specifically designed to take two distinct ranges
558       (e.g. "git range-diff R1 R2" to compare two ranges) do exist, but they
559       are exceptions. Unless otherwise noted, all "git" commands that operate
560       on a set of commits work on a single revision range. In other words,
561       writing two "two-dot range notation" next to each other, e.g.
562
563           $ git log A..B C..D
564
565       does not specify two revision ranges for most commands. Instead it will
566       name a single connected set of commits, i.e. those that are reachable
567       from either B or D but are reachable from neither A or C. In a linear
568       history like this:
569
570           ---A---B---o---o---C---D
571
572       because A and B are reachable from C, the revision range specified by
573       these two dotted ranges is a single commit D.
574
575   Other <rev>^ Parent Shorthand Notations
576       Three other shorthands exist, particularly useful for merge commits,
577       for naming a set that is formed by a commit and its parent commits.
578
579       The r1^@ notation means all parents of r1.
580
581       The r1^! notation includes commit r1 but excludes all of its parents.
582       By itself, this notation denotes the single commit r1.
583
584       The <rev>^-[<n>] notation includes <rev> but excludes the <n>th parent
585       (i.e. a shorthand for <rev>^<n>..<rev>), with <n> = 1 if not given.
586       This is typically useful for merge commits where you can just pass
587       <commit>^- to get all the commits in the branch that was merged in
588       merge commit <commit> (including <commit> itself).
589
590       While <rev>^<n> was about specifying a single commit parent, these
591       three notations also consider its parents. For example you can say
592       HEAD^2^@, however you cannot say HEAD^@^2.
593

REVISION RANGE SUMMARY

595       <rev>
596           Include commits that are reachable from <rev> (i.e. <rev> and its
597           ancestors).
598
599       ^<rev>
600           Exclude commits that are reachable from <rev> (i.e. <rev> and its
601           ancestors).
602
603       <rev1>..<rev2>
604           Include commits that are reachable from <rev2> but exclude those
605           that are reachable from <rev1>. When either <rev1> or <rev2> is
606           omitted, it defaults to HEAD.
607
608       <rev1>...<rev2>
609           Include commits that are reachable from either <rev1> or <rev2> but
610           exclude those that are reachable from both. When either <rev1> or
611           <rev2> is omitted, it defaults to HEAD.
612
613       <rev>^@, e.g. HEAD^@
614           A suffix ^ followed by an at sign is the same as listing all
615           parents of <rev> (meaning, include anything reachable from its
616           parents, but not the commit itself).
617
618       <rev>^!, e.g. HEAD^!
619           A suffix ^ followed by an exclamation mark is the same as giving
620           commit <rev> and all its parents prefixed with ^ to exclude them
621           (and their ancestors).
622
623       <rev>^-<n>, e.g. HEAD^-, HEAD^-2
624           Equivalent to <rev>^<n>..<rev>, with <n> = 1 if not given.
625
626       Here are a handful of examples using the Loeliger illustration above,
627       with each step in the notation’s expansion and selection carefully
628       spelt out:
629
630              Args   Expanded arguments    Selected commits
631              D                            G H D
632              D F                          G H I J D F
633              ^G D                         H D
634              ^D B                         E I J F B
635              ^D B C                       E I J F B C
636              C                            I J F C
637              B..C   = ^B C                C
638              B...C  = B ^F C              G H D E B C
639              B^-    = B^..B
640                     = ^B^1 B              E I J F B
641              C^@    = C^1
642                     = F                   I J F
643              B^@    = B^1 B^2 B^3
644                     = D E F               D G H E F I J
645              C^!    = C ^C^@
646                     = C ^C^1
647                     = C ^F                C
648              B^!    = B ^B^@
649                     = B ^B^1 ^B^2 ^B^3
650                     = B ^D ^E ^F          B
651              F^! D  = F ^I ^J D           G H D F
652

PARSEOPT

654       In --parseopt mode, git rev-parse helps massaging options to bring to
655       shell scripts the same facilities C builtins have. It works as an
656       option normalizer (e.g. splits single switches aggregate values), a bit
657       like getopt(1) does.
658
659       It takes on the standard input the specification of the options to
660       parse and understand, and echoes on the standard output a string
661       suitable for sh(1) eval to replace the arguments with normalized ones.
662       In case of error, it outputs usage on the standard error stream, and
663       exits with code 129.
664
665       Note: Make sure you quote the result when passing it to eval. See below
666       for an example.
667
668   Input Format
669       git rev-parse --parseopt input format is fully text based. It has two
670       parts, separated by a line that contains only --. The lines before the
671       separator (should be one or more) are used for the usage. The lines
672       after the separator describe the options.
673
674       Each line of options has this format:
675
676           <opt-spec><flags>*<arg-hint>? SP+ help LF
677
678       <opt-spec>
679           its format is the short option character, then the long option name
680           separated by a comma. Both parts are not required, though at least
681           one is necessary. May not contain any of the <flags> characters.
682           h,help, dry-run and f are examples of correct <opt-spec>.
683
684       <flags>
685           <flags> are of *, =, ?  or !.
686
687           •   Use = if the option takes an argument.
688
689           •   Use ?  to mean that the option takes an optional argument. You
690               probably want to use the --stuck-long mode to be able to
691               unambiguously parse the optional argument.
692
693           •   Use * to mean that this option should not be listed in the
694               usage generated for the -h argument. It’s shown for --help-all
695               as documented in gitcli(7).
696
697           •   Use !  to not make the corresponding negated long option
698               available.
699
700       <arg-hint>
701           <arg-hint>, if specified, is used as a name of the argument in the
702           help output, for options that take arguments.  <arg-hint> is
703           terminated by the first whitespace. It is customary to use a dash
704           to separate words in a multi-word argument hint.
705
706       The remainder of the line, after stripping the spaces, is used as the
707       help associated to the option.
708
709       Blank lines are ignored, and lines that don’t match this specification
710       are used as option group headers (start the line with a space to create
711       such lines on purpose).
712
713   Example
714           OPTS_SPEC="\
715           some-command [<options>] <args>...
716
717           some-command does foo and bar!
718           --
719           h,help    show the help
720
721           foo       some nifty option --foo
722           bar=      some cool option --bar with an argument
723           baz=arg   another cool option --baz with a named argument
724           qux?path  qux may take a path argument but has meaning by itself
725
726             An option group Header
727           C?        option C with an optional argument"
728
729           eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)"
730
731   Usage text
732       When "$@" is -h or --help in the above example, the following usage
733       text would be shown:
734
735           usage: some-command [<options>] <args>...
736
737               some-command does foo and bar!
738
739               -h, --help            show the help
740               --foo                 some nifty option --foo
741               --bar ...             some cool option --bar with an argument
742               --baz <arg>           another cool option --baz with a named argument
743               --qux[=<path>]        qux may take a path argument but has meaning by itself
744
745           An option group Header
746               -C[...]               option C with an optional argument
747

SQ-QUOTE

749       In --sq-quote mode, git rev-parse echoes on the standard output a
750       single line suitable for sh(1) eval. This line is made by normalizing
751       the arguments following --sq-quote. Nothing other than quoting the
752       arguments is done.
753
754       If you want command input to still be interpreted as usual by git
755       rev-parse before the output is shell quoted, see the --sq option.
756
757   Example
758           $ cat >your-git-script.sh <<\EOF
759           #!/bin/sh
760           args=$(git rev-parse --sq-quote "$@")   # quote user-supplied arguments
761           command="git frotz -n24 $args"          # and use it inside a handcrafted
762                                                   # command line
763           eval "$command"
764           EOF
765
766           $ sh your-git-script.sh "a b'c"
767

EXAMPLES

769       •   Print the object name of the current commit:
770
771               $ git rev-parse --verify HEAD
772
773       •   Print the commit object name from the revision in the $REV shell
774           variable:
775
776               $ git rev-parse --verify --end-of-options $REV^{commit}
777
778           This will error out if $REV is empty or not a valid revision.
779
780       •   Similar to above:
781
782               $ git rev-parse --default master --verify --end-of-options $REV
783
784           but if $REV is empty, the commit object name from master will be
785           printed.
786

GIT

788       Part of the git(1) suite
789
790
791
792Git 2.39.1                        2023-01-13                  GIT-REV-PARSE(1)
Impressum