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?
gitgit-patch se-share-sheet#willShow s-popover:shown->se-share-sheet#didShow" data-controller="se-share-sheet s-popover" data-gps-track="post.click({ item: 2, priv: 0, post_type: 1 })" data-s-popover-placement="bottom-start" data-se-share-sheet-license-name="CC BY-SA 4.0" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f4.0%2f" data-se-share-sheet-location="1" data-se-share-sheet-post-type="question" data-se-share-sheet-social="facebook twitter " data-se-share-sheet-subtitle="" data-se-share-sheet-title="Share a link to this question" title="Short permalink to this question" href="https://stackoverflow.com/q/5159185" rel="external nofollow" target="_blank">Share edited Aug 22, 2020 at 9:32 Antony 3,18222 gold badges2929 silver badges4242 bronze badges asked Mar 1, 2011 at 19:14 vrish88 18.6k88 gold badges3737 silver badges5656 bronze badgesIf 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.patchse-share-sheet#willShow s-popover:shown->se-share-sheet#didShow" data-controller="se-share-sheet s-popover" data-gps-track="post.click({ item: 2, priv: 0, post_type: 2 })" data-s-popover-placement="bottom-start" data-se-share-sheet-license-name="CC BY-SA 4.0" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f4.0%2f" data-se-share-sheet-location="2" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter " data-se-share-sheet-subtitle="" data-se-share-sheet-title="Share a link to this answer" title="Short permalink to this answer" href="https://stackoverflow.com/a/15438863" rel="external nofollow" target="_blank">Share edited Nov 6, 2020 at 5:52 answered Mar 15, 2013 at 17:43 jcarballo 25.2k33 gold badges2525 silver badges2727 bronze badges
git diff --no-color
. Otherwise, it looks like an encoding problem.
– jcarballo
Dec 22, 2013 at 21:06
git diff --staged > mypatch.patch
, because --staged
is a synonym for --cached
. I think it easier to remember.
– matthaeus
Mar 3, 2017 at 16:52
git diff
for unstaged changes.
git diff --cached
for staged changes.
git diff HEAD
for both staged and unstaged changes.
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?
– Eric
Mar 18, 2012 at 12:24
git diff --relative
– ejboy
Jan 8, 2013 at 14:03
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):
Tortoise Git
-> Create Patch Serial
Since
: FETCH_HEAD
will work if you're well-synced)Tortise Git
-> Show Log
reset "<branch>" to this...
Mixed
optionAnd how to apply them:
Tortoise Git
-> Apply Patch Serial
Tortise Git
-> Show Log
reset "<branch>" to this...
Mixed
optionTo create a patch with both modified & new files (staged) you can run:
git diff HEAD > file_name.patchse-share-sheet#willShow s-popover:shown->se-share-sheet#didShow" data-controller="se-share-sheet s-popover" data-gps-track="post.click({ item: 2, priv: 0, post_type: 2 })" data-s-popover-placement="bottom-start" data-se-share-sheet-license-name="CC BY-SA 3.0" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f3.0%2f" data-se-share-sheet-location="2" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter " data-se-share-sheet-subtitle="" data-se-share-sheet-title="Share a link to this answer" title="Short permalink to this answer" href="https://stackoverflow.com/a/33098742" rel="external nofollow" target="_blank">Share answered Oct 13, 2015 at 9:17 Ionel Sirbu 48744 silver badges33 bronze badges
git diff --cached > mypatch.patch
is not working.
– mining
Sep 23, 2016 at 6:12
file_name.patch
be used by the patch
command? Are they compatible with each other?
– Rakshith Ravi
Sep 4, 2019 at 7:58
git diff HEAD > file-name.patch
e.g. as follows: patch --forward --strip=1 < file-name.patch
– whyer
Jul 23, 2020 at 19:19