When it comes to a range of commits, cherry-picking is not practical.
A rebase --onto
would be better, where you replay the given range of commit on top of your integration branch, as Charles Bailey described here.
(also, look for "Here is how you would transplant a topic branch based on one branch to another" in the git rebase man page, to see a pratical example of git rebase --onto
)
If your current branch is integration:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
That will replay everything between:
- after the parent of
first_SHA-1_of_working_branch_range
(hence the ~1
): the first commit you want to replay
- up to "
integration
" (which points to the last commit you want to replay, from the working
branch)
to "tmp
" (which points to where integration
was pointing before)
If there is any conflict when one of those commits is replayed:
- either solve it and run "
git rebase --continue
".
- or skip this patch, and instead run "
git rebase --skip
"
- or cancel the all thing with a "
git rebase --abort
" (and put back the integration
branch on the tmp
branch)
After that rebase --onto
, integration
will be back at the last commit of the integration branch (that is "tmp
" branch + all the replayed commits)
With cherry-picking or rebase --onto
, do not forget it has consequences on subsequent merges, as described here.
A pure "cherry-pick
" solution is discussed here, and would involve something like:
If you want to use a patch approach then "git format-patch|git am" and "git cherry" are your options.
Currently, git cherry-pick
accepts only a single commit, but if you want to pick the range B
through D
that would be B^..D
in git lingo, so
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
But anyway, when you need to "replay" a range of commits, that work "replay" should push you to use the "rebase
" feature of Git.