git-rev-list(1)
===============
-v0.1, May 2005
NAME
----
SYNOPSIS
--------
-'git-rev-list' [ *--max-count*=number ] [ *--max-age*=timestamp ] [ *--min-age*=timestamp ] [ *--merge-order* [ *--show-breaks* ] ] <commit>
+[verse]
+'git-rev-list' [ \--max-count=number ]
+ [ \--skip=number ]
+ [ \--max-age=timestamp ]
+ [ \--min-age=timestamp ]
+ [ \--sparse ]
+ [ \--merges ]
+ [ \--no-merges ]
+ [ \--first-parent ]
+ [ \--remove-empty ]
+ [ \--full-history ]
+ [ \--not ]
+ [ \--all ]
+ [ \--branches ]
+ [ \--tags ]
+ [ \--remotes ]
+ [ \--stdin ]
+ [ \--quiet ]
+ [ \--topo-order ]
+ [ \--parents ]
+ [ \--timestamp ]
+ [ \--left-right ]
+ [ \--cherry-pick ]
+ [ \--encoding[=<encoding>] ]
+ [ \--(author|committer|grep)=<pattern> ]
+ [ \--regexp-ignore-case | -i ]
+ [ \--extended-regexp | -E ]
+ [ \--fixed-strings | -F ]
+ [ \--date={local|relative|default|iso|rfc|short} ]
+ [ [\--objects | \--objects-edge] [ \--unpacked ] ]
+ [ \--pretty | \--header ]
+ [ \--bisect ]
+ [ \--bisect-vars ]
+ [ \--bisect-all ]
+ [ \--merge ]
+ [ \--reverse ]
+ [ \--walk-reflogs ]
+ [ \--no-walk ] [ \--do-walk ]
+ <commit>... [ \-- <paths>... ]
DESCRIPTION
-----------
-Lists commit objects in reverse chronological order starting at the
-given commit, taking ancestry relationship into account. This is
-useful to produce human-readable log output.
-If *--merge-order* is specified, the commit history is decomposed into a unique sequence of minimal, non-linear
-epochs and maximal, linear epochs. Non-linear epochs are then linearised by sorting them into merge order, which
-is described below.
+List commits that are reachable by following the `parent` links from the
+given commit(s), but exclude commits that are reachable from the one(s)
+given with a '{caret}' in front of them. The output is given in reverse
+chronological order by default.
-Maximal, linear epochs correspond to periods of sequential development. Minimal, non-linear epochs
-correspond to periods of divergent development followed by a converging merge. The theory of epochs is described
-in more detail at link:http://blackcubes.dyndns.org/epoch/[http://blackcubes.dyndns.org/epoch/].
+You can think of this as a set operation. Commits given on the command
+line form a set of commits that are reachable from any of them, and then
+commits reachable from any of the ones given with '{caret}' in front are
+subtracted from that set. The remaining commits are what comes out in the
+command's output. Various other options and paths parameters can be used
+to further limit the result.
-The merge order for a non-linear epoch is defined as a linearisation for which the following invariants are true:
+Thus, the following command:
- 1. if a commit P is reachable from commit N, commit P sorts after commit N in the linearised list.
- 2. if Pi and Pj are any two parents of a merge M (with i < j), then any commit N, such that N is reachable from Pj
- but not reachable from Pi, sorts before all commits reachable from Pi.
-
-Invariant 1 states that later commits appear before earlier commits they are derived from.
+-----------------------------------------------------------------------
+ $ git rev-list foo bar ^baz
+-----------------------------------------------------------------------
-Invariant 2 states that commits unique to "later" parents in a merge, appear before all commits from "earlier" parents of
-a merge.
+means "list all the commits which are reachable from 'foo' or 'bar', but
+not from 'baz'".
-If *--show-breaks* is specified, each item of the list is output with a 2-character prefix consisting of one of:
- (|), (^), (=) followed by a space.
-Commits marked with (=) represent the boundaries of minimal, non-linear epochs and correspond either to the start of a period of divergent development or to the end of such a period.
-Commits marked with (|) are direct parents of commits immediately preceding the marked commit in the list.
-Commits marked with (^) are not parents of the immediately preceding commit. These "breaks" represent necessary discontinuities implied by trying to represent an arbtirary DAG in a linear form.
+A special notation "'<commit1>'..'<commit2>'" can be used as a
+short-hand for "{caret}'<commit1>' '<commit2>'". For example, either of
+the following may be used interchangeably:
+
+-----------------------------------------------------------------------
+ $ git rev-list origin..HEAD
+ $ git rev-list HEAD ^origin
+-----------------------------------------------------------------------
+
+Another special notation is "'<commit1>'...'<commit2>'" which is useful
+for merges. The resulting set of commits is the symmetric difference
+between the two operands. The following two commands are equivalent:
+
+-----------------------------------------------------------------------
+ $ git rev-list A B --not $(git merge-base --all A B)
+ $ git rev-list A...B
+-----------------------------------------------------------------------
+
+'git-rev-list' is a very essential git program, since it
+provides the ability to build and traverse commit ancestry graphs. For
+this reason, it has a lot of different options that enables it to be
+used by commands as different as 'git-bisect' and
+'git-repack'.
+
+OPTIONS
+-------
+
+:git-rev-list: 1
+include::rev-list-options.txt[]
+
+include::pretty-formats.txt[]
-*--show-breaks* is only valid if *--merge-order* is also specified.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
-Original *--merge-order* logic by Jon Seymour <jon.seymour@gmail.com>
-
Documentation
--------------
-Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
+Documentation by David Greaves, Junio C Hamano, Jonas Fonseca
+and the git-list <git@vger.kernel.org>.
GIT
---
-Part of the link:git.html[git] suite
-
+Part of the linkgit:git[1] suite