| 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. |
| |
| You can think of this as a set operation. Commits reachable from any of |
| the commits given on the command line form a set, 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. |
| |
| Thus, the following command: |
| |
| ifdef::git-rev-list[] |
| ----------------------------------------------------------------------- |
| $ git rev-list foo bar ^baz |
| ----------------------------------------------------------------------- |
| endif::git-rev-list[] |
| ifdef::git-log[] |
| ----------------------------------------------------------------------- |
| $ git log foo bar ^baz |
| ----------------------------------------------------------------------- |
| endif::git-log[] |
| |
| means "list all the commits which are reachable from 'foo' or 'bar', but |
| not from 'baz'". |
| |
| A special notation "'<commit1>'..'<commit2>'" can be used as a |
| short-hand for "^'<commit1>' '<commit2>'". For example, either of |
| the following may be used interchangeably: |
| |
| ifdef::git-rev-list[] |
| ----------------------------------------------------------------------- |
| $ git rev-list origin..HEAD |
| $ git rev-list HEAD ^origin |
| ----------------------------------------------------------------------- |
| endif::git-rev-list[] |
| ifdef::git-log[] |
| ----------------------------------------------------------------------- |
| $ git log origin..HEAD |
| $ git log HEAD ^origin |
| ----------------------------------------------------------------------- |
| endif::git-log[] |
| |
| 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: |
| |
| ifdef::git-rev-list[] |
| ----------------------------------------------------------------------- |
| $ git rev-list A B --not $(git merge-base --all A B) |
| $ git rev-list A...B |
| ----------------------------------------------------------------------- |
| endif::git-rev-list[] |
| ifdef::git-log[] |
| ----------------------------------------------------------------------- |
| $ git log A B --not $(git merge-base --all A B) |
| $ git log A...B |
| ----------------------------------------------------------------------- |
| endif::git-log[] |