Skip to content

Instantly share code, notes, and snippets.

Last active July 4, 2024 13:39
Show Gist options
  • Save nepsilon/22bc62a23f785716705c to your computer and use it in GitHub Desktop.
Save nepsilon/22bc62a23f785716705c to your computer and use it in GitHub Desktop.
How to generate and apply patches with git? — First published in issue #33

How to generate and apply patches with git?

It sometimes happen you need change code on a machine from which you cannot push to the repo. You’re ready to copy/paste what diff outputs to your local working copy.

You think there must be a better way to proceed and you’re right. It’s a simple 2 steps process:

1. Generate the patch:

git diff > some-changes.patch

2. Apply the diff:

Then copy this patch to your local machine, and apply it to your local working copy with:

git apply /path/to/some-changes.patch

And that’s it! The changes are now in your working copy and ready to be staged/commit/pushed :)

Copy link

ahwelp commented Apr 5, 2020

If you want to get the diff from a remote place without storing the file:

curl | git apply 

Copy link

Does this work when your patch spans multiple files, new files, deleted files, directories, etc?

Copy link

shad commented Apr 22, 2020


Copy link

wenijinew commented Oct 24, 2020


Did you ever face and solve the problem as follows?

git diff c5d633f7 relativepath/to/file > ~/p.patch
git apply --check ~/p.patch
error: patch failed: relativepath/to/file:1
error: relativepath/to/file: patch does not apply

Copy link

ievgen-pavlenko commented Nov 16, 2020

Try to use verbose mode git apply --verbose ~/p.patch
it will show more detailed info

To solve my problem I added --ignore-whitespace flag

Copy link

guettli commented May 27, 2021

I get:

git apply ~/tmp/cherry-pick.patch
error: foo/ No such file or directory
error: stand/foo/ No such file or directory

But this works:

patch -p0 < ~/tmp/cherry-pick.patch 

Copy link

Hello. I have a patch diff in .diff format, git give me errors when I apply it and I want to manual solve the errors.
How can I view what the patch is trying to do and my local state of the project in diff mod so that I can fix the changes manual

Copy link

@h3ndry you can open your patch file in any text editor and can see changes and file informations.

Copy link

Thanks for the snippets!
To make then work with changes to binary files, I had to run git diff --binary > some-changes.patch.

Copy link

If you have a commit id, then you can also use

git show bc6626756 > ./my-changes.patch

and to restore use

git apply ./my-changes.patch

Copy link

rmmgc commented Feb 16, 2023

git diff will always add file path to the patch like this.

diff --git a/<file_path> b/<file_path>

If you want to reuse the same patch on the file that does not match this file_path, you can do it with patch command.

patch <file_to_patch> <file_with_patch>

Copy link

I created patch file for stash using following command:
git stash show "stash@{0}" -p > '..\stashes\changes.patch'

When I try to apply the same using
git apply '..\stashes\changes.patch'

Got below error:
error: No valid patches in input (allow with "--allow-empty")

Path to the patch file is correct. Can someone please help?

Copy link

ssi-anik commented May 23, 2023

If you run git diff it will show changes that were tracked previously. But newly added files are not shown in the diff. To create a patch, I did the following.

  • git add -A # Add everything to the staging area.
  • git diff --staged --patch > changes.patch # --staged shows all the changes including new files
  • git reset # Reset to the old state

Now, I can apply the changes.

Edit: I just checked git diff --staged --patch and git diff --staged by creating two new patch files, and comparing them with the diff command. I don't find any difference.

Copy link

@ssi-anik Didn't think about untracked files—I always forget about them when thinking about git command, thanks!

I believe you can simplify your solution even more by using intent-to-add like this:

git add --intent-to-add --all
# or
git add -NA

Copy link

mrpointzby commented May 10, 2024

I can export the code change to .patch file, but the change only include the main part, Now I change the submodule and want to export the code change in submodule to the same .patch file so that I can apply the patch file for all code changes on new project including the submodule part, are there some commands to do this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment