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


92

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

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

git diff --cached > index.patch

回答:


129

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

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

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


12

git-diffが変更を示している間、マニュアルからgit-format-patchはメール送信に適したパッチを準備します。

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

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

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

そうです、その方法でインデックスのパッチを作成できます。


ありがとう。彼らがそれに基づいてパッチを設計したように、UNIXメールの何が特別なのですか?
Rafid、2011年

7
特別なことは何もありません。これは、gitがLinus Torvaldsによって設計されたワークフローであり、そのワークフローは、Linuxカーネルに統合する前に、検証のためにパッチを電子メールで送受信することを含みました。
Sylvain Defresne、2011年

GitはLinuxカーネルを維持するためにLinus Torvaldsによって設計されました。Unixメールは一般的な形式でした。
Abizern、2011年

1

git diffコマンドを使用してパッチファイルを生成できますが、コマンドによって生成されたパッチと比較するとgit format-patch、主な違いは次のとおりです。

  1. コミットに関するメタデータ(日付、作成者、コミットメッセージなど)はありません。
  2. 差分に関する統計はありません(変更されたxファイル、y挿入(+)、z削除(-)などのdiffstat)。
  3. バイナリの差分はなく、テキストの差分のみ。

ここに画像の説明を入力してください

変更されたすべてのファイル(インデックスまたは作業ディレクトリ内)のパッチファイルを生成するには:

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

生成されたパッチファイルを適用するには:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.