Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cherry pick only changes for only one file, not the whole commit

Tags:

git

You have different options based on what you want to achieve:

If you want the contents of the file to be the same as on the target branch, you can use git checkout <branch> -- <filename>. This will however not “cherry-pick” the changes that happened in a single commit, but just take the resulting state of said file. So if you added a line in a commit, but previous commits changed more, and you only want to add that line without those other changes, then a checkout is not what you want.

Otherwise if you want to apply the patch introduced in a commit to only a single file, you have multiple options. You could run git cherry-pick -n, i.e. without committing it, edit the commit (for example reset all files using git reset -- . and only add the file you actually want to change using git add <filename>). Or you could create the diff for the file and apply the diff then:

git diff <branch>^..<branch> -- <filename> | git apply

Create a patch file and apply it.

git diff branchname -- filename > patchfile
git apply patchfile

EDIT:

Since you need to take the changes from a commit, create the patch like this:

git show sha1 -- filename > patchfile

Another handy thing to do is get the patch locally and then use:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 

That's not a cherry-picking though.


Git has everything ready :)

Just use git checkout <sha> <path-to-file>


git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

this works if you want a single file from another branch to be copied to the current working branch


You can try doing this:

git show COMMIT_ID -- path/to/specific-file | git apply

For example:

git show 3feaf20 -- app/views/home/index.html | git apply

This is what are you looking for:

git checkout target-branch sha1 path/to/file

sha1 is optional