web-dev-qa-db-ja.com

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

作業ディレクトリに未確定の変更があるとします。コミットを作成せずにそれらからパッチを作るにはどうすればいいですか?

715
vrish88

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

332
sigjuice

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

git diff > mypatch.patch

しかし時々あなたがしていることの一部が追跡されずにあなたのgit diff出力にはないであろう新しいファイルであるということが起こります。ですから、パッチを適用する1つの方法は、すべてを新しいコミット(各ファイルごとにgit add、または単にgit add .)にステージングすることですが、コミットは行わないでください。

git diff --cached > mypatch.patch

パッチにバイナリファイルを追加したい場合は、 'binary'オプションを追加してください(例:mp3ファイル)。

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

後でパッチを適用することができます。

git apply mypatch.patch

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

1501
jcarballo

git diffgit 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. コミットbeforeあなたの一時的なコミットを右クリックし、reset "<branch>" to this...をクリックします
  5. Mixedオプションを選択してください

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

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

修正したファイルと新しいファイルの両方を使用して(段階的に)パッチを作成するには、次のコマンドを実行します。

git diff HEAD > file_name.patch
27
Ionel Sirbu

好き:

git format-patch HEAD~<N>

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

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

_ upd _
ここ あなたはそれらをどのように適用するかを見つけることができます。

_ upd _ format-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を作成します。 patchは次のコマンドから見える全ての変更と追跡されていないファイルを含みます。

git status .
9
Eugen Konkov

バイナリ化したい場合は、--binaryを実行するときにgit diffオプションを指定してください。

8
gitster