Question:
If I want to merge into a Git branch the changes made only to some of the files changed in a particular commit which includes changes to multiple files, how can this be achieved?
Suppose the Git commit called stuff
has changes to files A
, B
, C
, and D
but I want to merge only stuff
‘s changes to files A
and B
. It sounds like a job for git cherry-pick
but cherry-pick
only knows how to merge entire commits, not a subset of the files.
Answer:
I’d do it with cherry-pick -n
(--no-commit
) which lets you inspect (and modify) the result before committing:
1 2 3 4 5 6 7 8 9 10 |
git cherry-pick -n # unstage modifications you don't want to keep, and remove the # modifications from the work tree as well. # this does work recursively! git checkout HEAD # commit; the message will have been stored for you by cherry-pick git commit |
If the vast majority of modifications are things you don’t want, instead of checking out individual paths (the middle step), you could reset everything back, then add in what you want:
1 2 3 4 5 6 7 8 9 |
# unstage everything git reset HEAD # stage the modifications you do want git add # make the work tree match the index # (do this from the top level of the repo) git checkout . |