Skip to content

Instantly share code, notes, and snippets.

@nepsilon
Last active April 19, 2024 13:33
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 fullweb.io 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 :)

@coccoinomane
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.

@iamshouvikmitra
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

@rmmgc
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>

@MayuriVidekar
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?

@ssi-anik
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.

@BobToninho
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

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