Man page - git-cherry(1)
Packages contas this manual
- git-fsmonitor--daemon(1)
- git(1)
- gitprotocol-v2(5)
- gitweb(1)
- git-repack(1)
- git-reset(1)
- git-fetch-pack(1)
- git-daemon(1)
- git-subtree(1)
- git-fmt-merge-msg(1)
- git-diff-index(1)
- git-pack-redundant(1)
- git-ls-remote(1)
- git-mktree(1)
- git-count-objects(1)
- gitformat-commit-graph(5)
- git-worktree(1)
- git-verify-commit(1)
- gitmailmap(5)
- gitformat-bundle(5)
- gitcli(7)
- git-mailinfo(1)
- git-tag(1)
- git-remote(1)
- git-symbolic-ref(1)
- scalar(1)
- git-patch-id(1)
- git-interpret-trailers(1)
- git-init-db(1)
- gitremote-helpers(7)
- git-maintenance(1)
- git-mergetool(1)
- git-stage(1)
- git-diff-files(1)
- git-shortlog(1)
- git-submodule(1)
- git-cat-file(1)
- git-am(1)
- git-check-mailmap(1)
- git-add(1)
- git-write-tree(1)
- git-pack-objects(1)
- git-version(1)
- git-receive-pack(1)
- git-verify-tag(1)
- git-reflog(1)
- gitcredentials(7)
- gitrepository-layout(5)
- git-send-pack(1)
- gitignore(5)
- git-merge-file(1)
- git-http-push(1)
- git-credential-cache--daemon(1)
- git-merge-index(1)
- git-get-tar-commit-id(1)
- git-merge-one-file(1)
- git-remote-ext(1)
- git-blame(1)
- git-fetch(1)
- git-prune(1)
- git-bisect(1)
- git-replace(1)
- gitformat-chunk(5)
- gitglossary(7)
- git-show(1)
- git-rm(1)
- git-commit(1)
- gitcore-tutorial(7)
- git-merge(1)
- gitformat-pack(5)
- git-fsck(1)
- gitworkflows(7)
- git-name-rev(1)
- git-diagnose(1)
- git-log(1)
- git-whatchanged(1)
- git-check-attr(1)
- git-refs(1)
- git-gc(1)
- git-unpack-file(1)
- git-mailsplit(1)
- git-switch(1)
- git-sparse-checkout(1)
- git-multi-pack-index(1)
- gitprotocol-pack(5)
- git-init(1)
- git-rev-parse(1)
- git-merge-tree(1)
- gittutorial(7)
- git-request-pull(1)
- git-check-ref-format(1)
- git-mv(1)
- git-rev-list(1)
- git-bugreport(1)
- git-mktag(1)
- git-sh-i18n--envsubst(1)
- git-range-diff(1)
- git-notes(1)
- git-checkout-index(1)
- git-show-branch(1)
- gitprotocol-http(5)
- git-sh-setup(1)
- gitweb.conf(5)
- gitnamespaces(7)
- git-grep(1)
- gittutorial-2(7)
- git-fsck-objects(1)
- giteveryday(7)
- git-config(1)
- git-prune-packed(1)
- git-help(1)
- git-apply(1)
- git-fast-import(1)
- gitprotocol-capabilities(5)
- git-mergetool--lib(1)
- git-diff-tree(1)
- git-instaweb(1)
- git-difftool(1)
- git-pack-refs(1)
- git-restore(1)
- gitsubmodules(7)
- git-annotate(1)
- gitattributes(5)
- git-credential-store(1)
- git-ls-files(1)
- git-var(1)
- git-remote-fd(1)
- gitformat-index(5)
- gitrevisions(7)
- git-unpack-objects(1)
- git-diff(1)
- git-commit-tree(1)
- git-for-each-repo(1)
- git-web--browse(1)
- git-update-index(1)
- gitpacking(7)
- git-imap-send(1)
- git-show-ref(1)
- git-replay(1)
- git-for-each-ref(1)
- git-http-fetch(1)
- gitprotocol-common(5)
- git-cherry(1)
- git-merge-base(1)
- git-fast-export(1)
- git-column(1)
- git-upload-pack(1)
- gitfaq(7)
- git-stash(1)
- gitmodules(5)
- git-push(1)
- git-cherry-pick(1)
- gitformat-signature(5)
- git-verify-pack(1)
- githooks(5)
- git-hook(1)
- git-pull(1)
- git-http-backend(1)
- git-filter-branch(1)
- git-stripspace(1)
- git-rebase(1)
- git-revert(1)
- git-show-index(1)
- git-branch(1)
- git-quiltimport(1)
- gitdiffcore(7)
- gitcvs-migration(7)
- git-checkout(1)
- git-upload-archive(1)
- git-check-ignore(1)
- git-shell(1)
- git-update-server-info(1)
- git-bundle(1)
- git-hash-object(1)
- git-clone(1)
- git-commit-graph(1)
- git-update-ref(1)
- git-status(1)
- git-describe(1)
- git-sh-i18n(1)
- git-archive(1)
- git-clean(1)
- git-read-tree(1)
- git-rerere(1)
- git-index-pack(1)
- git-credential-cache(1)
- git-credential(1)
- git-format-patch(1)
- git-ls-tree(1)
apt-get install git-man
Manual
| GIT-CHERRY(1) | Git Manual | GIT-CHERRY(1) |
NAME
git-cherry - Find commits yet to be applied to upstream
SYNOPSIS
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 git-cherry-pick(1), git-am(1) or 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
<upstream>
<head>
<limit>
EXAMPLES
Patch workflows
git-cherry is frequently used in patch-based workflows (see 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
git-patch-id(1)
GIT
Part of the git(1) suite
| 07/30/2025 | Git 2.47.3 |