1GIT-REV-PARSE(1) Git Manual GIT-REV-PARSE(1)
2
3
4
6 git-rev-parse - Pick out and massage parameters
7
9 git rev-parse [<options>] <args>...
10
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
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
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
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
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
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
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
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
788 Part of the git(1) suite
789
790
791
792Git 2.39.1 2023-01-13 GIT-REV-PARSE(1)