git diff コマンドとふつうの diff / patch コマンド

git のサブコマンドである git diff と通常の diff コマンド、 patch コマンドあたりの使い方についていくつかポイントを書き留めておきます。

diff コマンドで git diff 風の出力を出す方法

git diff の出力結果では、削除行の先頭に - が、追加行の先頭に + がつきます。 通常の diff コマンドの出力はこれとは形式が異なるのですが、 -u オプションを付けることで同等の結果を生成することができます。

$ git diff file_old.txt file_new.txt
 /**
  * @file
- * Provides a trivial function.
+ * Provides an awesome function.
+ *
+ * @see another_module
  */

$ diff -u file_old.txt file_new.txt
 /**
  * @file
- * Provides a trivial function.
+ * Provides an awesome function.
+ *
+ * @see another_module
  */

-u オプションについて man コマンドで出てくるドキュメントでは次のように説明されています。

-u  -U NUM  --unified[=NUM]
       Output NUM (default 3) lines of unified context.

git diff のように色を付けたい場合は diff ではなく diff によく似た colordiff コマンドを使うとよいでしょう。 diff と同様の使い方ができます。

$ colordiff -u file_old.txt file_new.txt

colordiff は OS のパッケージマネージャでインストールできることが多いようです。 Mac の Homebrew の場合は次のコマンドで入ります。

$ brew install colordiff

git diff の出力結果を通常の patch で適用する方法

git diff で出力したパッチファイルは git apply で別のリポジトリに取り込むことができますが、リポジトリではないまったく別の場所で取り込みたい場合は patch コマンドが使用できます。

$ # リポジトリで git diff でパッチを作成
$ git diff > a_big_change.patch

$ # 同じファイルはあるが git で管理されていない場所でパッチをあてる
$ patch -p1 < a_big_change.patch

ここで注意すべきは git apply の場合は git apply パッチファイル.patch としますが、 patch コマンドの場合は patch < パッチファイル.patch とする必要がある点です。 -p オプションはパッチファイルのヘッダー内の対象ファイルのパスのうちスラッシュをいくつ無視するかという指定です。 -p1 とすると先頭から 1 つめのスラッシュまでを無視することになります。

他にも関連するものがあれば追記していきます。

以上です。