現在の作業ディレクトリの変更からgitパッチを作成します


880

作業ディレクトリにコミットされていない変更があるとします。コミットを作成せずにパッチを作成するにはどうすればよいですか?


29
2番目の回答の方が4倍近く人気があるため、承認された回答はおそらく変更する必要があります。
Tim Ogilvy

5
@TimOgilvyは同意した。OPはそれを行う必要があります。2番目の回答ははるかに人気があり、より多くの情報を提供します
John Demetriou

1
タイトルのコミットされていない変更からのパッチが必要であることは言及する価値があると思います。
2i3r

回答:


401

git diffステージングされていない変更の場合。 git diff --cached段階的な変更の場合。


12
うん、git diffはgit applyの逆です
Spike Gronim

33
git format-patchバイナリの差分といくつかのメタ情報も含まれています。実際、それはパッチを作成するための最善の策ですが、これはチェックインされたソース/変更に対してのみ機能しますよね?
エリック

20
現在のディレクトリに関連するパッチを作成すると便利な場合があります。これを達成するために、使用git diff --relative
ejboy

30
git diff> a.patchでファイルに書き込む
qasimzee

139
皮肉に接する簡潔な、以下の答えはより役に立ちます。
Air

1865

まだ変更をコミットしていない場合は、次のようにします。

git diff > mypatch.patch

しかし、時々、実行している処理の一部が、追跡されず、git diff出力に含まれない新しいファイルである場合があります。したがって、パッチを実行する1つの方法は、新しいコミット(git add各ファイル、または単にgit add .)のすべてをステージングすることですが、コミットは実行せず、次のようにします。

git diff --cached > mypatch.patch

パッチにバイナリファイル(mp3ファイルなど)を追加する場合は、「binary」オプションを追加します。

git diff --cached --binary > mypatch.patch

後でパッチを適用できます。

git apply mypatch.patch

注:の--staged同義語として使用することもでき--cachedます。


128
例をありがとうございました。受け入れられた回答とは対照的に、話すだけでなく、それを行う方法をコマンドに示します。非常に役に立ち、完璧に動作しました:)
nuala

4
私はそれを正確に行い、git applyを実行すると「致命的:認識されない入力」が発生しました。これを引き起こす原因とそれを修正する方法はありますか?
Vitaly

6
@Vitaly:テキストエディターでパッチを開いた場合、パッチは読み取り可能ですか?たとえば、color.diff設定が設定されている場合、パッチに「git apply」が失敗する可能性のある「カラー文字」がいくつか含まれますgit diff --no-color。その場合は、を試してください。それ以外の場合は、エンコードの問題のように見えます。
jcarballo 2013

3
「追跡されない新しいファイル」に関連する:「git diff」と「git diff --cached」は、「git add <file>」が最初に呼び出された場合にのみ機能します。(私はgitを初めて使用するので、なぜ毎回空のパッチが適用されるのか疑問に思いました)
匿名

5
これにより、私は奇妙なマージ/リベースの地獄からかなり簡単に抜け出すことができました。おかげで、:)
John Hunt

86

git diffそしてgit apply、テキストファイルに対して動作しますが、バイナリファイルでは動作しません。

完全なバイナリパッチは簡単に作成できますが、一時的なコミットを作成する必要があります。一時的なコミットを行ったら、次のコマンドでパッチを作成できます。

git format-patch <options...>

パッチを作成したら、次のコマンドを実行します。

git reset --mixed <SHA of commit *before* your working-changes commit(s)>

これにより、一時的なコミットがロールバックされます。最終結果では、最初に行ったのと同じ変更で作業コピーを(意図的に)ダーティのままにします。

受信側では、同じ履歴を使用して、コミット履歴なしで変更を作業コピーに適用できます。パッチを適用するだけgit reset --mixed <SHA of commit *before* the patches>です。

このオプション全体を機能させるには、適切に同期する必要がある場合があることに注意してください。パッチを作成する人が私が行ったほど多くの変更をプルダウンしていなかったときに、パッチを適用するときにいくつかのエラーが発生しました。おそらくそれを機能させる方法はいくつかありますが、私はそれを詳しく調べていません。


Tortoise Gitで同じパッチを作成する方法は次のとおりです(そのツールの使用はお勧めしません)。

  1. 作業中の変更をコミットします
  2. ブランチのルートディレクトリを右クリックし、Tortoise Git-> をクリックします。Create Patch Serial
    1. 理にかなっている方の範囲を選択し(SinceFETCH_HEADあなたはよく同期している場合に動作します)
    2. パッチを作成します
  3. ブランチのルートディレクトリを右クリックし、Tortise Git-> をクリックします。Show Log
  4. 一時的なコミットのにコミットを右クリックし、reset "<branch>" to this...
  5. Mixedオプションを選択してください

そしてそれらを適用する方法:

  1. ブランチのルートディレクトリを右クリックし、Tortoise Git-> をクリックします。Apply Patch Serial
  2. 正しいパッチを選択して適用します
  3. ブランチのルートディレクトリを右クリックし、Tortise Git-> をクリックします。Show Log
  4. パッチのコミットのにコミットを右クリックして、reset "<branch>" to this...
  5. Mixedオプションを選択してください

5
技術的には、OPが回避するように求めたコミットを作成する必要がありますが、これは一時的なものであり、回答は関係なく役に立ちます。
davenpcj 2014年

33

変更されたファイルと新しいファイル(ステージング済み)の両方でパッチを作成するには、次のコマンドを実行します。

git diff HEAD > file_name.patch

おかげで、私の場合、この回答は機能しますが機能しgit diff --cached > mypatch.patchません。
採鉱

質問があります:コマンドfile_name.patchで使用できますpatchか?それらは互いに互換性がありますか?
Rakshith Ravi、

git diff + git diff --cached / staged == git diff HEAD(最後のコミット以降のすべての変更を表示)
K.シンボル

20

好き:

git format-patch HEAD~<N>

どこ<N>のパッチとして保存する最後のコミットの数です。

コマンドの使用方法の詳細はDOCにあります

UPD
ここでは、それらを適用する方法を見つけることができます。

UPDformat-patch
エイリアスの追加のアイデアが得られなかった人のために:

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"'

次に、プロジェクトリポジトリの任意のディレクトリで次を実行します。

git make-patch

このコマンドは0001-uncommited.patch、現在のディレクトリに作成されます。パッチには、次のコマンドで表示されるすべての変更と追跡されていないファイルが含まれます。

git status .

@jcarballo:答えを更新しました。あなたが持っている通知があれば遠慮なく私に送ってください。
Eugen Konkov

2
コミットを作成してコミット解除するよりも簡単な方法があります。git diff --cached --binary
Gaurav Agarwal

9

バイナリ--binaryを実行する場合は、を実行するときにオプションを指定しますgit diff


0

ファイルを指定して、特に複数のディレクトリにまたがる場合など、相対的な変更を加えたファイルのみを含めることもできます。

git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch

これは回答やコメントで指定されていないことがわかりました。これらはすべて関連性があり、正しいため、追加することにしました。明示的は暗黙的よりも優れています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.