about summary refs log blame commit diff
path: root/Documentation/git-cherry.txt
blob: 0ea921a5931647f21f74a44a80622c3d3c16827c (plain) (tree)
















































































































































                                                                       
git-cherry(1)
=============

NAME
----
git-cherry - Find commits yet to be applied to upstream

SYNOPSIS
--------
[verse]
'git cherry' [-v] [<upstream> [<head> [<limit>]]]

DESCRIPTION
-----------
Determine whether there are commits in `<head>..<upstream>` that are
equivalent to those in the range `<limit>..<head>`.

The equivalence test is based on the diff, after removing whitespace
and line numbers.  git-cherry therefore detects when commits have been
"copied" by means of linkgit:git-cherry-pick[1], linkgit:git-am[1] or
linkgit:git-rebase[1].

Outputs the SHA1 of every commit in `<limit>..<head>`, prefixed with
`-` for commits that have an equivalent in <upstream>, and `+` for
commits that do not.

OPTIONS
-------
-v::
	Show the commit subjects next to the SHA1s.

<upstream>::
	Upstream branch to search for equivalent commits.
	Defaults to the upstream branch of HEAD.

<head>::
	Working branch; defaults to HEAD.

<limit>::
	Do not report commits up to (and including) limit.

EXAMPLES
--------

Patch workflows
~~~~~~~~~~~~~~~

git-cherry is frequently used in patch-based workflows (see
linkgit:gitworkflows[7]) to determine if a series of patches has been
applied by the upstream maintainer.  In such a workflow you might
create and send a topic branch like this:

------------
$ git checkout -b topic origin/master
# work and create some commits
$ git format-patch origin/master
$ git send-email ... 00*
------------

Later, you can see whether your changes have been applied by saying
(still on `topic`):

------------
$ git fetch  # update your notion of origin/master
$ git cherry -v
------------

Concrete example
~~~~~~~~~~~~~~~~

In a situation where topic consisted of three commits, and the
maintainer applied two of them, the situation might look like:

------------
$ git log --graph --oneline --decorate --boundary origin/master...topic
* 7654321 (origin/master) upstream tip commit
[... snip some other commits ...]
* cccc111 cherry-pick of C
* aaaa111 cherry-pick of A
[... snip a lot more that has happened ...]
| * cccc000 (topic) commit C
| * bbbb000 commit B
| * aaaa000 commit A
|/
o 1234567 branch point
------------

In such cases, git-cherry shows a concise summary of what has yet to
be applied:

------------
$ git cherry origin/master topic
- cccc000... commit C
+ bbbb000... commit B
- aaaa000... commit A
------------

Here, we see that the commits A and C (marked with `-`) can be
dropped from your `topic` branch when you rebase it on top of
`origin/master`, while the commit B (marked with `+`) still needs to
be kept so that it will be sent to be applied to `origin/master`.


Using a limit
~~~~~~~~~~~~~

The optional <limit> is useful in cases where your topic is based on
other work that is not in upstream.  Expanding on the previous
example, this might look like:

------------
$ git log --graph --oneline --decorate --boundary origin/master...topic
* 7654321 (origin/master) upstream tip commit
[... snip some other commits ...]
* cccc111 cherry-pick of C
* aaaa111 cherry-pick of A
[... snip a lot more that has happened ...]
| * cccc000 (topic) commit C
| * bbbb000 commit B
| * aaaa000 commit A
| * 0000fff (base) unpublished stuff F
[... snip ...]
| * 0000aaa unpublished stuff A
|/
o 1234567 merge-base between upstream and topic
------------

By specifying `base` as the limit, you can avoid listing commits
between `base` and `topic`:

------------
$ git cherry origin/master topic base
- cccc000... commit C
+ bbbb000... commit B
- aaaa000... commit A
------------


SEE ALSO
--------
linkgit:git-patch-id[1]

GIT
---
Part of the linkgit:git[1] suite