作業ディレクトリにコミットされていない変更があるとします。コミットを作成せずにパッチを作成するにはどうすればよいですか?
作業ディレクトリにコミットされていない変更があるとします。コミットを作成せずにパッチを作成するにはどうすればよいですか?
回答:
git diff
ステージングされていない変更の場合。 git diff --cached
段階的な変更の場合。
git format-patch
バイナリの差分といくつかのメタ情報も含まれています。実際、それはパッチを作成するための最善の策ですが、これはチェックインされたソース/変更に対してのみ機能しますよね?
git diff --relative
まだ変更をコミットしていない場合は、次のようにします。
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
ます。
git diff --no-color
。その場合は、を試してください。それ以外の場合は、エンコードの問題のように見えます。
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 diff --cached > mypatch.patch
ません。
file_name.patch
で使用できます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 .