作業ディレクトリにコミットされていない変更があるとします。コミットを作成せずにそれらからパッチを作成するにはどうすればよいですか?
7 に答える
まだ変更をコミットしていない場合は、次のようにします。
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
git diff
ステージングされていない変更の場合。
git diff --cached
段階的な変更の場合。
git diff HEAD
段階的変更と非段階的変更の両方。
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で同じパッチを作成する方法は次のとおりです(そのツールの使用をお勧めします)。
- 作業の変更をコミットする
- ブランチルートディレクトリを右クリックし、
Tortoise Git
->をクリックしますCreate Patch Serial
- 意味のある範囲を選択してください(
Since
:FETCH_HEAD
同期が取れていれば機能します) - パッチを作成します
- 意味のある範囲を選択してください(
- ブランチルートディレクトリを右クリックし、
Tortise Git
->をクリックしますShow Log
- 一時コミットの前にコミットを右クリックし、をクリックします
reset "<branch>" to this...
Mixed
オプションを選択します
そしてそれらを適用する方法:
- ブランチルートディレクトリを右クリックし、
Tortoise Git
->をクリックしますApply Patch Serial
- 正しいパッチを選択して適用します
- ブランチルートディレクトリを右クリックし、
Tortise Git
->をクリックしますShow Log
- パッチのコミットの前にコミットを右クリックし、をクリックします
reset "<branch>" to this...
Mixed
オプションを選択します
変更されたファイルと新しいファイル(ステージング済み)の両方を含むパッチを作成するには、次のコマンドを実行できます。
git diff HEAD > file_name.patch
好き:
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 .
バイナリ--binary
を実行する場合は、を実行するときにオプションを指定しますgit diff
。
また、ファイルを指定して、特に複数のディレクトリにまたがる場合に、相対的な変更が加えられたファイルのみを含めることもできます。
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
これは、すべて関連性があり正しい回答やコメントで指定されていないことがわかったので、追加することにしました。明示的は暗黙的よりも優れています!