作業ディレクトリに未確定の変更があるとします。コミットを作成せずにそれらからパッチを作るにはどうすればいいですか?
ステージングされていない変更の場合はgit diff
。段階的な変更の場合はgit diff --cached
。
まだ変更をコミットしていない場合は、次のようにします。
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
の同義語として使用することもできます。
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 _
ここ あなたはそれらをどのように適用するかを見つけることができます。
_ 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 .
バイナリ化したい場合は、--binary
を実行するときにgit diff
オプションを指定してください。