Say I have uncommitted changes in my working directory. How can I make a patch from those without having to create a commit?
git diff
for unstaged changes.
git diff --cached
for staged changes.
git diff HEAD
for both staged and unstaged changes.
git diff
enough to create a patch that can be applied with git apply
? –
Toole 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? –
Falbala git diff --relative
–
Liddy git diff --relative
is just git diff .
(where the dot implies the diff from the current directory). –
Riccio git diff --relative > x
I could not use the output for git apply x
. It just happened nothing. Strange. –
Keilakeily git diff
does not create a patch, it merely shows the changes. Below answer actually answers the question. –
Woodcut git diff
command be used by the patch
command? Are they compatible with each other? –
Ripen git diff HEAD
for both staged and unstaged. - i suggest you to append it to the answer –
Indefinable 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
git diff --no-color
. Otherwise, it looks like an encoding problem. –
Riccio git diff --staged > mypatch.patch
, because --staged
is a synonym for --cached
. I think it easier to remember. –
Reiterant git add
whatever you want to stage. Git therminology :) –
Riccio git diff HEAD~1 HEAD > mypatch.patch
Then to apply it anywhere else: git apply mypatch.patch
–
Costard git add -N <file-mask>
it won't actually add the files but will start tracking them instead, making them available for git diff
and the patch. –
Existence fatal: unrecognized input
is probably related to encoding issues (when using Powershell). Try to use cmd
or git-bash
instead of powershell
–
Mcmasters git diff
for unstaged changes.
git diff --cached
for staged changes.
git diff HEAD
for both staged and unstaged changes.
git diff
enough to create a patch that can be applied with git apply
? –
Toole 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? –
Falbala git diff --relative
–
Liddy git diff --relative
is just git diff .
(where the dot implies the diff from the current directory). –
Riccio git diff --relative > x
I could not use the output for git apply x
. It just happened nothing. Strange. –
Keilakeily git diff
does not create a patch, it merely shows the changes. Below answer actually answers the question. –
Woodcut git diff
command be used by the patch
command? Are they compatible with each other? –
Ripen git diff HEAD
for both staged and unstaged. - i suggest you to append it to the answer –
Indefinable 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
To create a patch with both modified & new files (staged) you can run:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
is not working. –
Isar file_name.patch
be used by the patch
command? Are they compatible with each other? –
Ripen git diff HEAD > file-name.patch
e.g. as follows: patch --forward --strip=1 < file-name.patch
–
Indefinable I like:
git format-patch HEAD~<N>
where <N>
is number of last commits to save as patches.
The details how to use the command are in the DOC
UPD Explanation of fix when GIT_PREFIX is called from top level Git directory
UPD
Here you can find how to apply them then.
UPD For those who did not get the idea of format-patch
Add alias:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX:-.};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Then at any directory of your project repository run:
git make-patch
This command will create 0001-uncommited.patch
at your current directory. Patch will contain all the changes and untracked files that are visible to next command:
git status .
git config --global alias.make-patch ....
–
Epimorphosis ../folder
, it's not doing it only in the current working directory. –
Elroyels If you want to do binary, give a --binary
option when you run git diff
.
We could also specify the files, to include just the files with relative changes, particularly when they span multiple directories e.x.
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
I found this to be not specified in the answers or comments, which are all relevant and correct, so chose to add it. Explicit is better than implicit!
uncomminetted
git diff --cached > name.patch
committed (much more useful)
git diff HEAD~commit_count > name.patch
© 2022 - 2024 — McMap. All rights reserved.