Partly cherry-picking a commit with Git
Assuming the changes you want are at the head of the branch you want the changes from, use git checkout
for a single file :
git checkout branch_that_has_the_changes_you_want path/to/file.rb
for multiple files just daisy chain :
git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
I know I'm answering an old question, but it looks like there's a new way to do this with interactively checking out:
git checkout -p bc66559
Credit to Can I interactively pick hunks from another git commit?
The core thing you're going to want here is git add -p
(-p
is a synonym for --patch
). This provides an interactive way to add in content, letting you decide whether each hunk should go in or not, and even letting you manually edit the patch if necessary.
To use it in combination with cherry-pick:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Thanks to Tim Henigan for reminding me that git-cherry-pick
has a --no-commit
option, and thanks to Felix Rabe for pointing out that you need to git reset
. If you only want to leave a few things out of the commit, you could use git reset <path>...
to unstage just those files.)
You can provide specific paths to add -p
if necessary. If you're starting with a patch you could replace the cherry-pick
with apply
.
If you really want to git cherry-pick -p <commit>
(that option does not exist), you can use
git checkout -p <commit>
That will diff the current commit against the commit you specify, and allow you to apply hunks from that diff individually. This option may be more useful if the commit you're pulling in has merge conflicts in part of the commit you're not interested in. (Note, however, that checkout
differs from cherry-pick
: checkout
tries to apply <commit>
's contents entirely, while cherry-pick
applies the diff of the specified commit from it's parent. This means that checkout
can apply more than just that commit, which might be more than you want.)
Building on Mike Monkiewicz answer you can also specify a single or more files to checkout from the supplied sha1/branch.
git checkout -p bc66559 -- path/to/file.java
This will allow you to interactively pick the changes you want to have applied to your current version of the file.