Create a git patch from the uncommitted changes in the current working directory
https://stackoverflow.com/questions/5159185/create-a-git-patch-from-the-uncommitted-changes-in-the-current-working-directory
Say I have uncommitted changes in my working directory. How can I make a patch from those without having to create a commit?
-
45Accepted answer should probably be changed, given the second answer is nearly four times more popular.– Tim OgilvyFeb 19, 2018 at 12:37
-
6@TimOgilvy agreed. OP should do it. Second answer is far more popular and gives more information– John DemetriouApr 19, 2018 at 7:21
-
1I think it worth to mention you need patch from uncommitted changes in the title either.– 2i3rFeb 4, 2020 at 11:09
8 Answers
If you haven't yet commited the changes, then:
git diff > mypatch.patch
But sometimes it happens that part of the stuff you're doing are new files that are untracked and won't be in your git diff
output. So, one way to do a patch is to stage everything for a new commit (git add
each file, or just git add .
) but don't do the commit, and then:
git diff --cached > mypatch.patch
Add the 'binary' option if you want to add binary files to the patch (e.g. mp3 files):
git diff --cached --binary > mypatch.patch
You can later apply the patch:
git apply mypatch.patch
-
6I did exactly that and got "fatal: unrecognized input" upon executing git apply. Any idea what can cause this and how to fix it?– VitalyDec 22, 2013 at 20:11
-
9@Vitaly: is your patch readable if you open it with a text editor? it should be clean with no strange characters, for example if the color.diff setting is set your patch will have some 'color characters' that can make 'git apply' fail, in that case try
git diff --no-color
. Otherwise, it looks like an encoding problem. Dec 22, 2013 at 21:06 -
8To create the patch from the already staged changes you could also do
git diff --staged > mypatch.patch
, because--staged
is a synonym for--cached
. I think it easier to remember. Mar 3, 2017 at 16:52 -
3Related to "new files that are untracked": "git diff" and "git diff --cached" only work if "git add <file>" has been called first. (I am new to git and wondered why I got an empty patch everytime) Apr 25, 2017 at 8:41
-
5This got me out of a strange merge/rebase hell pretty easily, thanks :) Aug 31, 2017 at 10:34
git diff
for unstaged changes.
git diff --cached
for staged changes.
git diff HEAD
for both staged and unstaged changes.
-
20
-
40
git format-patch
also includes binary diffs and some meta info. Actually that would be the best bet for creating a patch, but afaik this does only work for checked in sources/ changes, right?– EricMar 18, 2012 at 12:24 -
26Sometimes it might be useful to create a patch relative to the current directory. To achieve this, use
git diff --relative
– ejboyJan 8, 2013 at 14:03 -
38
-
152
git diff
and git apply
will work for text files, but won't work for binary files.
You can easily create a full binary patch, but you will have to create a temporary commit. Once you've made your temporary commit(s), you can create the patch with:
git format-patch <options...>
After you've made the patch, run this command:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
This will roll back your temporary commit(s). The final result leaves your working copy (intentionally) dirty with the same changes you originally had.
On the receiving side, you can use the same trick to apply the changes to the working copy, without having the commit history. Simply apply the patch(es), and git reset --mixed <SHA of commit *before* the patches>
.
Note that you might have to be well-synced for this whole option to work. I've seen some errors when applying patches when the person making them hadn't pulled down as many changes as I had. There are probably ways to get it to work, but I haven't looked far into it.
Here's how to create the same patches in Tortoise Git (not that I recommend using that tool):
- Commit your working changes
- Right click the branch root directory and click
Tortoise Git
->Create Patch Serial
- Choose whichever range makes sense (
Since
:FETCH_HEAD
will work if you're well-synced) - Create the patch(es)
- Choose whichever range makes sense (
- Right click the branch root directory and click
Tortise Git
->Show Log
- Right click the commit before your temporary commit(s), and click
reset "<branch>" to this...
- Select the
Mixed
option
And how to apply them:
- Right click the branch root directory and click
Tortoise Git
->Apply Patch Serial
- Select the correct patch(es) and apply them
- Right click the branch root directory and click
Tortise Git
->Show Log
- Right click the commit before the patch's commit(s), and click
reset "<branch>" to this...
- Select the
Mixed
option
-
5Technically this does require creating a commit which OP asked to avoid, but it's a temporary one and the answer is useful regardless.– davenpcjJan 24, 2014 at 21:25
To create a patch with both modified & new files (staged) you can run:
git diff HEAD > file_name.patch
-
1Thanks, in my case, this answer works, but
git diff --cached > mypatch.patch
is not working.– miningSep 23, 2016 at 6:12 -
I have a question: can
file_name.patch
be used by thepatch
command? Are they compatible with each other? Sep 4, 2019 at 7:58 -
1git diff + git diff --cached/staged == git diff HEAD (show all the changes since the last commit) Feb 12, 2020 at 5:17
-
1@RakshithRavi afaik, yes they are. you may use your patch created by
git diff HEAD > file-name.patch
e.g. as follows:patch --forward --strip=1 < file-name.patch
– whyerJul 23, 2020 at 19:19