1git-rev-parse(1) 2================ 3 4NAME 5---- 6git-rev-parse - Pick out and massage parameters 7 8 9SYNOPSIS 10-------- 11'git rev-parse' [ --option ] <args>... 12 13DESCRIPTION 14----------- 15 16Many git porcelainish commands take mixture of flags 17(i.e. parameters that begin with a dash '-') and parameters 18meant for the underlying 'git rev-list' command they use internally 19and flags and parameters for the other commands they use 20downstream of 'git rev-list'. This command is used to 21distinguish between them. 22 23 24OPTIONS 25------- 26--parseopt:: 27 Use 'git rev-parse' in option parsing mode (see PARSEOPT section below). 28 29--keep-dashdash:: 30 Only meaningful in `--parseopt` mode. Tells the option parser to echo 31 out the first `--` met instead of skipping it. 32 33--stop-at-non-option:: 34 Only meaningful in `--parseopt` mode. Lets the option parser stop at 35 the first non-option argument. This can be used to parse sub-commands 36 that take options themself. 37 38--sq-quote:: 39 Use 'git rev-parse' in shell quoting mode (see SQ-QUOTE 40 section below). In contrast to the `--sq` option below, this 41 mode does only quoting. Nothing else is done to command input. 42 43--revs-only:: 44 Do not output flags and parameters not meant for 45 'git rev-list' command. 46 47--no-revs:: 48 Do not output flags and parameters meant for 49 'git rev-list' command. 50 51--flags:: 52 Do not output non-flag parameters. 53 54--no-flags:: 55 Do not output flag parameters. 56 57--default <arg>:: 58 If there is no parameter given by the user, use `<arg>` 59 instead. 60 61--verify:: 62 The parameter given must be usable as a single, valid 63 object name. Otherwise barf and abort. 64 65-q:: 66--quiet:: 67 Only meaningful in `--verify` mode. Do not output an error 68 message if the first argument is not a valid object name; 69 instead exit with non-zero status silently. 70 71--sq:: 72 Usually the output is made one line per flag and 73 parameter. This option makes output a single line, 74 properly quoted for consumption by shell. Useful when 75 you expect your parameter to contain whitespaces and 76 newlines (e.g. when using pickaxe `-S` with 77 'git diff-\*'). In contrast to the `--sq-quote` option, 78 the command input is still interpreted as usual. 79 80--not:: 81 When showing object names, prefix them with '{caret}' and 82 strip '{caret}' prefix from the object names that already have 83 one. 84 85--symbolic:: 86 Usually the object names are output in SHA1 form (with 87 possible '{caret}' prefix); this option makes them output in a 88 form as close to the original input as possible. 89 90--symbolic-full-name:: 91 This is similar to \--symbolic, but it omits input that 92 are not refs (i.e. branch or tag names; or more 93 explicitly disambiguating "heads/master" form, when you 94 want to name the "master" branch when there is an 95 unfortunately named tag "master"), and show them as full 96 refnames (e.g. "refs/heads/master"). 97 98--abbrev-ref[={strict|loose}]:: 99 A non-ambiguous short name of the objects name. 100 The option core.warnAmbiguousRefs is used to select the strict 101 abbreviation mode. 102 103--all:: 104 Show all refs found in `$GIT_DIR/refs`. 105 106--branches:: 107 Show branch refs found in `$GIT_DIR/refs/heads`. 108 109--tags:: 110 Show tag refs found in `$GIT_DIR/refs/tags`. 111 112--remotes:: 113 Show tag refs found in `$GIT_DIR/refs/remotes`. 114 115--show-toplevel:: 116 Show the absolute path of the top-level directory. 117 118--show-prefix:: 119 When the command is invoked from a subdirectory, show the 120 path of the current directory relative to the top-level 121 directory. 122 123--show-cdup:: 124 When the command is invoked from a subdirectory, show the 125 path of the top-level directory relative to the current 126 directory (typically a sequence of "../", or an empty string). 127 128--git-dir:: 129 Show `$GIT_DIR` if defined else show the path to the .git directory. 130 131--is-inside-git-dir:: 132 When the current working directory is below the repository 133 directory print "true", otherwise "false". 134 135--is-inside-work-tree:: 136 When the current working directory is inside the work tree of the 137 repository print "true", otherwise "false". 138 139--is-bare-repository:: 140 When the repository is bare print "true", otherwise "false". 141 142--short:: 143--short=number:: 144 Instead of outputting the full SHA1 values of object names try to 145 abbreviate them to a shorter unique name. When no length is specified 146 7 is used. The minimum length is 4. 147 148--since=datestring:: 149--after=datestring:: 150 Parse the date string, and output the corresponding 151 --max-age= parameter for 'git rev-list'. 152 153--until=datestring:: 154--before=datestring:: 155 Parse the date string, and output the corresponding 156 --min-age= parameter for 'git rev-list'. 157 158<args>...:: 159 Flags and parameters to be parsed. 160 161 162SPECIFYING REVISIONS 163-------------------- 164 165A revision parameter typically, but not necessarily, names a 166commit object. They use what is called an 'extended SHA1' 167syntax. Here are various ways to spell object names. The 168ones listed near the end of this list are to name trees and 169blobs contained in a commit. 170 171* The full SHA1 object name (40-byte hexadecimal string), or 172 a substring of such that is unique within the repository. 173 E.g. dae86e1950b1277e545cee180551750029cfe735 and dae86e both 174 name the same commit object if there are no other object in 175 your repository whose object name starts with dae86e. 176 177* An output from 'git describe'; i.e. a closest tag, optionally 178 followed by a dash and a number of commits, followed by a dash, a 179 `g`, and an abbreviated object name. 180 181* A symbolic ref name. E.g. 'master' typically means the commit 182 object referenced by $GIT_DIR/refs/heads/master. If you 183 happen to have both heads/master and tags/master, you can 184 explicitly say 'heads/master' to tell git which one you mean. 185 When ambiguous, a `<name>` is disambiguated by taking the 186 first match in the following rules: 187 188 . if `$GIT_DIR/<name>` exists, that is what you mean (this is usually 189 useful only for `HEAD`, `FETCH_HEAD`, `ORIG_HEAD` and `MERGE_HEAD`); 190 191 . otherwise, `$GIT_DIR/refs/<name>` if exists; 192 193 . otherwise, `$GIT_DIR/refs/tags/<name>` if exists; 194 195 . otherwise, `$GIT_DIR/refs/heads/<name>` if exists; 196 197 . otherwise, `$GIT_DIR/refs/remotes/<name>` if exists; 198 199 . otherwise, `$GIT_DIR/refs/remotes/<name>/HEAD` if exists. 200+ 201HEAD names the commit your changes in the working tree is based on. 202FETCH_HEAD records the branch you fetched from a remote repository 203with your last 'git fetch' invocation. 204ORIG_HEAD is created by commands that moves your HEAD in a drastic 205way, to record the position of the HEAD before their operation, so that 206you can change the tip of the branch back to the state before you ran 207them easily. 208MERGE_HEAD records the commit(s) you are merging into your branch 209when you run 'git merge'. 210 211* A ref followed by the suffix '@' with a date specification 212 enclosed in a brace 213 pair (e.g. '\{yesterday\}', '\{1 month 2 weeks 3 days 1 hour 1 214 second ago\}' or '\{1979-02-26 18:30:00\}') to specify the value 215 of the ref at a prior point in time. This suffix may only be 216 used immediately following a ref name and the ref must have an 217 existing log ($GIT_DIR/logs/<ref>). Note that this looks up the state 218 of your *local* ref at a given time; e.g., what was in your local 219 `master` branch last week. If you want to look at commits made during 220 certain times, see `--since` and `--until`. 221 222* A ref followed by the suffix '@' with an ordinal specification 223 enclosed in a brace pair (e.g. '\{1\}', '\{15\}') to specify 224 the n-th prior value of that ref. For example 'master@\{1\}' 225 is the immediate prior value of 'master' while 'master@\{5\}' 226 is the 5th prior value of 'master'. This suffix may only be used 227 immediately following a ref name and the ref must have an existing 228 log ($GIT_DIR/logs/<ref>). 229 230* You can use the '@' construct with an empty ref part to get at a 231 reflog of the current branch. For example, if you are on the 232 branch 'blabla', then '@\{1\}' means the same as 'blabla@\{1\}'. 233 234* The special construct '@\{-<n>\}' means the <n>th branch checked out 235 before the current one. 236 237* A suffix '{caret}' to a revision parameter means the first parent of 238 that commit object. '{caret}<n>' means the <n>th parent (i.e. 239 'rev{caret}' 240 is equivalent to 'rev{caret}1'). As a special rule, 241 'rev{caret}0' means the commit itself and is used when 'rev' is the 242 object name of a tag object that refers to a commit object. 243 244* A suffix '{tilde}<n>' to a revision parameter means the commit 245 object that is the <n>th generation grand-parent of the named 246 commit object, following only the first parent. I.e. rev~3 is 247 equivalent to rev{caret}{caret}{caret} which is equivalent to 248 rev{caret}1{caret}1{caret}1. See below for a illustration of 249 the usage of this form. 250 251* A suffix '{caret}' followed by an object type name enclosed in 252 brace pair (e.g. `v0.99.8{caret}\{commit\}`) means the object 253 could be a tag, and dereference the tag recursively until an 254 object of that type is found or the object cannot be 255 dereferenced anymore (in which case, barf). `rev{caret}0` 256 introduced earlier is a short-hand for `rev{caret}\{commit\}`. 257 258* A suffix '{caret}' followed by an empty brace pair 259 (e.g. `v0.99.8{caret}\{\}`) means the object could be a tag, 260 and dereference the tag recursively until a non-tag object is 261 found. 262 263* A colon, followed by a slash, followed by a text: this names 264 a commit whose commit message starts with the specified text. 265 This name returns the youngest matching commit which is 266 reachable from any ref. If the commit message starts with a 267 '!', you have to repeat that; the special sequence ':/!', 268 followed by something else than '!' is reserved for now. 269 270* A suffix ':' followed by a path; this names the blob or tree 271 at the given path in the tree-ish object named by the part 272 before the colon. 273 274* A colon, optionally followed by a stage number (0 to 3) and a 275 colon, followed by a path; this names a blob object in the 276 index at the given path. Missing stage number (and the colon 277 that follows it) names a stage 0 entry. During a merge, stage 278 1 is the common ancestor, stage 2 is the target branch's version 279 (typically the current branch), and stage 3 is the version from 280 the branch being merged. 281 282Here is an illustration, by Jon Loeliger. Both commit nodes B 283and C are parents of commit node A. Parent commits are ordered 284left-to-right. 285 286........................................ 287G H I J 288 \ / \ / 289 D E F 290 \ | / \ 291 \ | / | 292 \|/ | 293 B C 294 \ / 295 \ / 296 A 297........................................ 298 299 A = = A^0 300 B = A^ = A^1 = A~1 301 C = A^2 = A^2 302 D = A^^ = A^1^1 = A~2 303 E = B^2 = A^^2 304 F = B^3 = A^^3 305 G = A^^^ = A^1^1^1 = A~3 306 H = D^2 = B^^2 = A^^^2 = A~2^2 307 I = F^ = B^3^ = A^^3^ 308 J = F^2 = B^3^2 = A^^3^2 309 310 311SPECIFYING RANGES 312----------------- 313 314History traversing commands such as 'git log' operate on a set 315of commits, not just a single commit. To these commands, 316specifying a single revision with the notation described in the 317previous section means the set of commits reachable from that 318commit, following the commit ancestry chain. 319 320To exclude commits reachable from a commit, a prefix `{caret}` 321notation is used. E.g. `{caret}r1 r2` means commits reachable 322from `r2` but exclude the ones reachable from `r1`. 323 324This set operation appears so often that there is a shorthand 325for it. When you have two commits `r1` and `r2` (named according 326to the syntax explained in SPECIFYING REVISIONS above), you can ask 327for commits that are reachable from r2 excluding those that are reachable 328from r1 by `{caret}r1 r2` and it can be written as `r1..r2`. 329 330A similar notation `r1\...r2` is called symmetric difference 331of `r1` and `r2` and is defined as 332`r1 r2 --not $(git merge-base --all r1 r2)`. 333It is the set of commits that are reachable from either one of 334`r1` or `r2` but not from both. 335 336Two other shorthands for naming a set that is formed by a commit 337and its parent commits exist. The `r1{caret}@` notation means all 338parents of `r1`. `r1{caret}!` includes commit `r1` but excludes 339all of its parents. 340 341Here are a handful of examples: 342 343 D G H D 344 D F G H I J D F 345 ^G D H D 346 ^D B E I J F B 347 B...C G H D E B C 348 ^D B C E I J F B C 349 C^@ I J F 350 F^! D G H D F 351 352PARSEOPT 353-------- 354 355In `--parseopt` mode, 'git rev-parse' helps massaging options to bring to shell 356scripts the same facilities C builtins have. It works as an option normalizer 357(e.g. splits single switches aggregate values), a bit like `getopt(1)` does. 358 359It takes on the standard input the specification of the options to parse and 360understand, and echoes on the standard output a line suitable for `sh(1)` `eval` 361to replace the arguments with normalized ones. In case of error, it outputs 362usage on the standard error stream, and exits with code 129. 363 364Input Format 365~~~~~~~~~~~~ 366 367'git rev-parse --parseopt' input format is fully text based. It has two parts, 368separated by a line that contains only `--`. The lines before the separator 369(should be more than one) are used for the usage. 370The lines after the separator describe the options. 371 372Each line of options has this format: 373 374------------ 375<opt_spec><flags>* SP+ help LF 376------------ 377 378`<opt_spec>`:: 379 its format is the short option character, then the long option name 380 separated by a comma. Both parts are not required, though at least one 381 is necessary. `h,help`, `dry-run` and `f` are all three correct 382 `<opt_spec>`. 383 384`<flags>`:: 385 `<flags>` are of `*`, `=`, `?` or `!`. 386 * Use `=` if the option takes an argument. 387 388 * Use `?` to mean that the option is optional (though its use is discouraged). 389 390 * Use `*` to mean that this option should not be listed in the usage 391 generated for the `-h` argument. It's shown for `--help-all` as 392 documented in linkgit:gitcli[7]. 393 394 * Use `!` to not make the corresponding negated long option available. 395 396The remainder of the line, after stripping the spaces, is used 397as the help associated to the option. 398 399Blank lines are ignored, and lines that don't match this specification are used 400as option group headers (start the line with a space to create such 401lines on purpose). 402 403Example 404~~~~~~~ 405 406------------ 407OPTS_SPEC="\ 408some-command [options] <args>... 409 410some-command does foo and bar! 411-- 412h,help show the help 413 414foo some nifty option --foo 415bar= some cool option --bar with an argument 416 417 An option group Header 418C? option C with an optional argument" 419 420eval `echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?` 421------------ 422 423SQ-QUOTE 424-------- 425 426In `--sq-quote` mode, 'git rev-parse' echoes on the standard output a 427single line suitable for `sh(1)` `eval`. This line is made by 428normalizing the arguments following `--sq-quote`. Nothing other than 429quoting the arguments is done. 430 431If you want command input to still be interpreted as usual by 432'git rev-parse' before the output is shell quoted, see the `--sq` 433option. 434 435Example 436~~~~~~~ 437 438------------ 439$ cat >your-git-script.sh <<\EOF 440#!/bin/sh 441args=$(git rev-parse --sq-quote "$@") # quote user-supplied arguments 442command="git frotz -n24 $args" # and use it inside a handcrafted 443 # command line 444eval "$command" 445EOF 446 447$ sh your-git-script.sh "a b'c" 448------------ 449 450EXAMPLES 451-------- 452 453* Print the object name of the current commit: 454+ 455------------ 456$ git rev-parse --verify HEAD 457------------ 458 459* Print the commit object name from the revision in the $REV shell variable: 460+ 461------------ 462$ git rev-parse --verify $REV 463------------ 464+ 465This will error out if $REV is empty or not a valid revision. 466 467* Same as above: 468+ 469------------ 470$ git rev-parse --default master --verify $REV 471------------ 472+ 473but if $REV is empty, the commit object name from master will be printed. 474 475 476Author 477------ 478Written by Linus Torvalds <torvalds@osdl.org> . 479Junio C Hamano <gitster@pobox.com> and Pierre Habouzit <madcoder@debian.org> 480 481Documentation 482-------------- 483Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. 484 485GIT 486--- 487Part of the linkgit:git[1] suite