Documentation / git-rev-list.txton commit make git barf when an alias changes environment variables (4394efe)
   1git-rev-list(1)
   2===============
   3
   4NAME
   5----
   6git-rev-list - Lists commit objects in reverse chronological order
   7
   8
   9SYNOPSIS
  10--------
  11[verse]
  12'git-rev-list' [ \--max-count=number ]
  13             [ \--skip=number ]
  14             [ \--max-age=timestamp ]
  15             [ \--min-age=timestamp ]
  16             [ \--sparse ]
  17             [ \--no-merges ]
  18             [ \--remove-empty ]
  19             [ \--not ]
  20             [ \--all ]
  21             [ \--stdin ]
  22             [ \--topo-order ]
  23             [ \--parents ]
  24             [ \--left-right ]
  25             [ \--cherry-pick ]
  26             [ \--encoding[=<encoding>] ]
  27             [ \--(author|committer|grep)=<pattern> ]
  28             [ \--regexp-ignore-case ] [ \--extended-regexp ]
  29             [ \--date={local|relative|default} ]
  30             [ [\--objects | \--objects-edge] [ \--unpacked ] ]
  31             [ \--pretty | \--header ]
  32             [ \--bisect ]
  33             [ \--bisect-vars ]
  34             [ \--merge ]
  35             [ \--reverse ]
  36             [ \--walk-reflogs ]
  37             <commit>... [ \-- <paths>... ]
  38
  39DESCRIPTION
  40-----------
  41
  42Lists commit objects in reverse chronological order starting at the
  43given commit(s), taking ancestry relationship into account.  This is
  44useful to produce human-readable log output.
  45
  46Commits which are stated with a preceding '{caret}' cause listing to
  47stop at that point. Their parents are implied. Thus the following
  48command:
  49
  50-----------------------------------------------------------------------
  51        $ git-rev-list foo bar ^baz
  52-----------------------------------------------------------------------
  53
  54means "list all the commits which are included in 'foo' and 'bar', but
  55not in 'baz'".
  56
  57A special notation "'<commit1>'..'<commit2>'" can be used as a
  58short-hand for "{caret}'<commit1>' '<commit2>'". For example, either of
  59the following may be used interchangeably:
  60
  61-----------------------------------------------------------------------
  62        $ git-rev-list origin..HEAD
  63        $ git-rev-list HEAD ^origin
  64-----------------------------------------------------------------------
  65
  66Another special notation is "'<commit1>'...'<commit2>'" which is useful
  67for merges.  The resulting set of commits is the symmetric difference
  68between the two operands.  The following two commands are equivalent:
  69
  70-----------------------------------------------------------------------
  71        $ git-rev-list A B --not $(git-merge-base --all A B)
  72        $ git-rev-list A...B
  73-----------------------------------------------------------------------
  74
  75gitlink:git-rev-list[1] is a very essential git program, since it
  76provides the ability to build and traverse commit ancestry graphs. For
  77this reason, it has a lot of different options that enables it to be
  78used by commands as different as gitlink:git-bisect[1] and
  79gitlink:git-repack[1].
  80
  81OPTIONS
  82-------
  83
  84Commit Formatting
  85~~~~~~~~~~~~~~~~~
  86
  87Using these options, gitlink:git-rev-list[1] will act similar to the
  88more specialized family of commit log tools: gitlink:git-log[1],
  89gitlink:git-show[1], and gitlink:git-whatchanged[1]
  90
  91include::pretty-options.txt[]
  92
  93--relative-date::
  94
  95        Synonym for `--date=relative`.
  96
  97--date={relative,local,default}::
  98
  99        Only takes effect for dates shown in human-readable format, such
 100        as when using "--pretty".
 101+
 102`--date=relative` shows dates relative to the current time,
 103e.g. "2 hours ago".
 104+
 105`--date=local` shows timestamps in user's local timezone.
 106+
 107`--date=default` shows timestamps in the original timezone
 108(either committer's or author's).
 109
 110--header::
 111
 112        Print the contents of the commit in raw-format; each record is
 113        separated with a NUL character.
 114
 115--parents::
 116
 117        Print the parents of the commit.
 118
 119--left-right::
 120
 121        Mark which side of a symmetric diff a commit is reachable from.
 122        Commits from the left side are prefixed with `<` and those from
 123        the right with `>`.  If combined with `--boundary`, those
 124        commits are prefixed with `-`.
 125+
 126For example, if you have this topology:
 127+
 128-----------------------------------------------------------------------
 129             y---b---b  branch B
 130            / \ /
 131           /   .
 132          /   / \
 133         o---x---a---a  branch A
 134-----------------------------------------------------------------------
 135+
 136you would get an output line this:
 137+
 138-----------------------------------------------------------------------
 139        $ git rev-list --left-right --boundary --pretty=oneline A...B
 140
 141        >bbbbbbb... 3rd on b
 142        >bbbbbbb... 2nd on b
 143        <aaaaaaa... 3rd on a
 144        <aaaaaaa... 2nd on a
 145        -yyyyyyy... 1st on b
 146        -xxxxxxx... 1st on a
 147-----------------------------------------------------------------------
 148
 149Diff Formatting
 150~~~~~~~~~~~~~~~
 151
 152Below are listed options that control the formatting of diff output.
 153Some of them are specific to gitlink:git-rev-list[1], however other diff
 154options may be given. See gitlink:git-diff-files[1] for more options.
 155
 156-c::
 157
 158        This flag changes the way a merge commit is displayed.  It shows
 159        the differences from each of the parents to the merge result
 160        simultaneously instead of showing pairwise diff between a parent
 161        and the result one at a time. Furthermore, it lists only files
 162        which were modified from all parents.
 163
 164--cc::
 165
 166        This flag implies the '-c' options and further compresses the
 167        patch output by omitting hunks that show differences from only
 168        one parent, or show the same change from all but one parent for
 169        an Octopus merge.
 170
 171-r::
 172
 173        Show recursive diffs.
 174
 175-t::
 176
 177        Show the tree objects in the diff output. This implies '-r'.
 178
 179Commit Limiting
 180~~~~~~~~~~~~~~~
 181
 182Besides specifying a range of commits that should be listed using the
 183special notations explained in the description, additional commit
 184limiting may be applied.
 185
 186--
 187
 188-n 'number', --max-count='number'::
 189
 190        Limit the number of commits output.
 191
 192--skip='number'::
 193
 194        Skip 'number' commits before starting to show the commit output.
 195
 196--since='date', --after='date'::
 197
 198        Show commits more recent than a specific date.
 199
 200--until='date', --before='date'::
 201
 202        Show commits older than a specific date.
 203
 204--max-age='timestamp', --min-age='timestamp'::
 205
 206        Limit the commits output to specified time range.
 207
 208--author='pattern', --committer='pattern'::
 209
 210        Limit the commits output to ones with author/committer
 211        header lines that match the specified pattern (regular expression).
 212
 213--grep='pattern'::
 214
 215        Limit the commits output to ones with log message that
 216        matches the specified pattern (regular expression).
 217
 218--regexp-ignore-case::
 219
 220        Match the regexp limiting patterns without regard to letters case.
 221
 222--extended-regexp::
 223
 224        Consider the limiting patterns to be extended regular expressions
 225        instead of the default basic regular expressions.
 226
 227--remove-empty::
 228
 229        Stop when a given path disappears from the tree.
 230
 231--no-merges::
 232
 233        Do not print commits with more than one parent.
 234
 235--not::
 236
 237        Reverses the meaning of the '{caret}' prefix (or lack thereof)
 238        for all following revision specifiers, up to the next '--not'.
 239
 240--all::
 241
 242        Pretend as if all the refs in `$GIT_DIR/refs/` are listed on the
 243        command line as '<commit>'.
 244
 245--stdin::
 246
 247        In addition to the '<commit>' listed on the command
 248        line, read them from the standard input.
 249
 250--cherry-pick::
 251
 252        Omit any commit that introduces the same change as
 253        another commit on the "other side" when the set of
 254        commits are limited with symmetric difference.
 255+
 256For example, if you have two branches, `A` and `B`, a usual way
 257to list all commits on only one side of them is with
 258`--left-right`, like the example above in the description of
 259that option.  It however shows the commits that were cherry-picked
 260from the other branch (for example, "3rd on b" may be cherry-picked
 261from branch A).  With this option, such pairs of commits are
 262excluded from the output.
 263
 264-g, --walk-reflogs::
 265
 266        Instead of walking the commit ancestry chain, walk
 267        reflog entries from the most recent one to older ones.
 268        When this option is used you cannot specify commits to
 269        exclude (that is, '{caret}commit', 'commit1..commit2',
 270        nor 'commit1...commit2' notations cannot be used).
 271+
 272With '\--pretty' format other than oneline (for obvious reasons),
 273this causes the output to have two extra lines of information
 274taken from the reflog.  By default, 'commit@{Nth}' notation is
 275used in the output.  When the starting commit is specified as
 276'commit@{now}', output also uses 'commit@{timestamp}' notation
 277instead.  Under '\--pretty=oneline', the commit message is
 278prefixed with this information on the same line.
 279
 280--merge::
 281
 282        After a failed merge, show refs that touch files having a
 283        conflict and don't exist on all heads to merge.
 284
 285--boundary::
 286
 287        Output uninteresting commits at the boundary, which are usually
 288        not shown.
 289
 290--dense, --sparse::
 291
 292When optional paths are given, the default behaviour ('--dense') is to
 293only output commits that changes at least one of them, and also ignore
 294merges that do not touch the given paths.
 295
 296Use the '--sparse' flag to makes the command output all eligible commits
 297(still subject to count and age limitation), but apply merge
 298simplification nevertheless.
 299
 300--bisect::
 301
 302Limit output to the one commit object which is roughly halfway between
 303the included and excluded commits. Thus, if
 304
 305-----------------------------------------------------------------------
 306        $ git-rev-list --bisect foo ^bar ^baz
 307-----------------------------------------------------------------------
 308
 309outputs 'midpoint', the output of the two commands
 310
 311-----------------------------------------------------------------------
 312        $ git-rev-list foo ^midpoint
 313        $ git-rev-list midpoint ^bar ^baz
 314-----------------------------------------------------------------------
 315
 316would be of roughly the same length.  Finding the change which
 317introduces a regression is thus reduced to a binary search: repeatedly
 318generate and test new 'midpoint's until the commit chain is of length
 319one.
 320
 321--bisect-vars::
 322
 323This calculates the same as `--bisect`, but outputs text ready
 324to be eval'ed by the shell. These lines will assign the name of
 325the midpoint revision to the variable `bisect_rev`, and the
 326expected number of commits to be tested after `bisect_rev` is
 327tested to `bisect_nr`, the expected number of commits to be
 328tested if `bisect_rev` turns out to be good to `bisect_good`,
 329the expected number of commits to be tested if `bisect_rev`
 330turns out to be bad to `bisect_bad`, and the number of commits
 331we are bisecting right now to `bisect_all`.
 332
 333--
 334
 335Commit Ordering
 336~~~~~~~~~~~~~~~
 337
 338By default, the commits are shown in reverse chronological order.
 339
 340--topo-order::
 341
 342        This option makes them appear in topological order (i.e.
 343        descendant commits are shown before their parents).
 344
 345--date-order::
 346
 347        This option is similar to '--topo-order' in the sense that no
 348        parent comes before all of its children, but otherwise things
 349        are still ordered in the commit timestamp order.
 350
 351--reverse::
 352
 353        Output the commits in reverse order.
 354
 355Object Traversal
 356~~~~~~~~~~~~~~~~
 357
 358These options are mostly targeted for packing of git repositories.
 359
 360--objects::
 361
 362        Print the object IDs of any object referenced by the listed
 363        commits.  'git-rev-list --objects foo ^bar' thus means "send me
 364        all object IDs which I need to download if I have the commit
 365        object 'bar', but not 'foo'".
 366
 367--objects-edge::
 368
 369        Similar to '--objects', but also print the IDs of excluded
 370        commits prefixed with a "-" character.  This is used by
 371        gitlink:git-pack-objects[1] to build "thin" pack, which records
 372        objects in deltified form based on objects contained in these
 373        excluded commits to reduce network traffic.
 374
 375--unpacked::
 376
 377        Only useful with '--objects'; print the object IDs that are not
 378        in packs.
 379
 380
 381include::pretty-formats.txt[]
 382
 383
 384Author
 385------
 386Written by Linus Torvalds <torvalds@osdl.org>
 387
 388Documentation
 389--------------
 390Documentation by David Greaves, Junio C Hamano, Jonas Fonseca
 391and the git-list <git@vger.kernel.org>.
 392
 393GIT
 394---
 395Part of the gitlink:git[7] suite