How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?
Asked Answered
S

2

687

I have a .diff file created by a coworker, and would like to apply the changes listed in that diff file to my local branch of the exact same repository. I do not have access to that worker's pc or branch that was used to generate this diff file.

Obviously I could go line by line and retype everything, but i'd rather not subject the system to human error. What's the easiest way to do this?

Sesame answered 7/9, 2012 at 15:13 Comment(1)
I got in trouble using git diff and git apply because I used an alias which translated to git diff --ignore-all-space. This made my patch invalid. Make sure to just use bare git diff!Davis
T
1013

Copy the diff file to the root of your repository, and then do:

git apply yourcoworkers.diff

More information about the apply command is available on its man page.

By the way: A better way to exchange whole commits by file is the combination of the commands git format-patch on the sender and then git am on the receiver, because it also transfers the authorship info and the commit message.

If the patch application fails and if the commits the diff was generated from are actually in your repo, you can use the -3 option of apply that tries to merge in the changes.

It also works with Unix pipe as follows:

git diff d892531 815a3b5 | git apply
Ti answered 7/9, 2012 at 15:17 Comment(15)
Thanks for the reply, but that caused an error saying, patch failed: filename.php:202 error:filename.php: patch does not apply. The good news is that its not the first filename in the file, so it at least would have been able to process some of the file. Any thoughts?Sesame
You also seem to have changes to that file which stop the patch from working. To solve this you could commit your changes, create a new branch, reset it to the commit where you and your co-worker diverged, apply the patch, commit it, and then merge the two branches.Ti
The file was too different from what existed in this case to use the diff file. I went ahead and did it manually, but +1 for the correct command, and i'll accept that this should have been the right answer.Sesame
How do you unapply the diff?Sauternes
@Sauternes When you didn't commit it yet, do git reset --hard to return your working tree to the last commit. When you already committed it, append the revision you want to return to.Ti
Thank you @Ti but what about when you had some other non-committed changes in the branch, and you just want to get rid of the ones coming from the diff?Sauternes
@Sauternes Sorry, but then you are screwed. Git only creates a checkpoint you can return to when you make a commit. That's why many git guides recommend to commit early and often.Ti
@Sauternes at the very least, run git stash before you perform some action that you may want to reverse after. Then either way, you can bring back your stash, and commit at some later point.Reddy
@Ti This is not strictly accurate, see git apply --reverse.Publicist
I feel that format-patch is much stabler than diff. I just failed 3 times using diff, but instant success using format-patch.Halie
that's great! worked for me, needed to apply into master the differences from other branch just related to a specific path, so I did: git diff master other_branch -- my_dir_path | git applyVitalize
Works great. Although no need to put the diff file in the repo's root. It can be placed anywhere (e.g. ~/Desktop)Spade
if you when you run this command you get "xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun" you need to install XCode or XCode command line tools. studytonight.com/post/…Overwork
the --binary flag might also be helpful if you have binary files added in the related commitsPrincipality
I got into trouble with this because I used an alias which translated to git diff --ignore-all-space. Make sure to just use bare git diff!Davis
O
23

It seems like you can also use the patch command. Put the diff in the root of the repository and run patch from the command line.

patch -i yourcoworkers.diff

or

patch -p0 -i yourcoworkers.diff

You may need to remove the leading folder structure if they created the diff without using --no-prefix.

If so, then you can remove the parts of the folder that don't apply using:

patch -p1 -i yourcoworkers.diff

The -p(n) signifies how many parts of the folder structure to remove.

More information on creating and applying patches here.

You can also use

git apply yourcoworkers.diff --stat 

to see if the diff by default will apply any changes. It may say 0 files affected if the patch is not applied correctly (different folder structure).

Overwork answered 4/2, 2021 at 8:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.