web-dev-qa-db-ja.com

「git format-patch」と「git diff」の違いは何ですか?

「git format-patch」と「git diff」の出力に違いは見られませんが、何かありますか?また、「git diff」を使用してパッチを作成し、git applyを使用して適用することはできませんか?

私の問題は、インデックスに変更が追加されていることですが、明らかにgit format-patchはコミットのみを受け入れるため、diffの出力を使用できる場合は、このコマンドを使用してインデックスの変更のパッチを作成できます:

git diff --cached > index.patch
85
Rafid

git format-patchで作成されたパッチには、コミットに関するメタ情報(コミッター、日付、コミットメッセージなど)も含まれ、バイナリデータの差分が含まれます。すべてがメールとしてフォーマットされるため、簡単に送信できます。それを受け取った人はgit amで対応するコミットを再作成でき、すべてのメタデータはそのまま残ります。単純なdiffのスーパーセットであるため、git applyで適用することもできます。

git diffで作成されたパッチは、コンテキスト付きの単純な差分になります(diff -uを考えてください)。 git applyで適用することもできますが、メタデータは再作成されません(存在しないため)。

要約すると、git format-patchはコミットの送信に役立ち、git diffは2つのツリー間の差分を取得するのに役立ちます。

121

マニュアルから git-format-patch は電子メールの提出に適したパッチを準備し、 git-diff は変更を表示します。

それらは2つの異なるものであり、異なる目的を持っています。たまたまパッチ形式を出力するだけです。ただし、git-format-patchは、コミットに関するデータ(日付、作成者、コミットメッセージ)を追加し、Unixメールメッセージとして送信するのに適した形式にバンドルします(ただし、これらは単なるファイルであるため、他のユーザーに送信できます)メソッドとgit-amによって適用されます)。

また、git-format-patchは、指定した範囲のコミットごとにパッチファイルを生成します。これらの変更は、git-amを使用してリポジトリにコミットとして追加されます。

git-diffは、要求する2つの状態の差分を表示するだけで、パッチファイルの作成に使用できます。ただし、これは単なる通常のパッチファイルであり、パッチを適用すると作業ディレクトリの状態が変更されるだけです。

そして、そうです、あなたはインデックスのパッチをそのように作成できます。

9
Abizern