How to cherry-pick multiple commits
Git 1.7.2 introduced the ability to cherry pick a range of commits. From the release notes:
git cherry-pick
learned to pick a range of commits (e.g.cherry-pick A..B
andcherry-pick --stdin
), so didgit revert
; these do not support the nicer sequencing controlrebase [-i]
has, though.
To cherry-pick all the commits from commit A
to commit B
(where A
is older than B
), run:
git cherry-pick A^..B
If you want to ignore A itself, run:
git cherry-pick A..B
Notes from comments:
A
should be older thanB
, orA
should be from another branch.- On Windows, it should be
A^^..B
as the caret needs to be escaped, or it should be"A^..B"
(double quotes). - In
zsh
shell, it should be'A^..B'
(single quotes) as the caret is a special character. - For an exposition, see the answer by Gabriel Staples.
(Credits to damian, J. B. Rainsberger, sschaef, Neptilo, Pete and TMin in the comments.)
Or the requested one-liner:
git rebase --onto a b f
If you have selective revisions to merge, say A, C, F, J from A,B,C,D,E,F,G,H,I,J commits, simply use the below command:
git cherry-pick A C F J
The simplest way to do this is with the onto
option to rebase
. Suppose that the branch which current finishes at a
is called mybranch and this is the branch that you want to move c
-f
onto.
# checkout mybranch
git checkout mybranch
# reset it to f (currently includes a)
git reset --hard f
# rebase every commit after b and transplant it onto a
git rebase --onto a b