1. ホーム
  2. git

[解決済み] git diff を変更の種類でフィルタリングする

2022-06-19 14:34:54

質問

以下のように git diff を変更されたファイルに限定する方法はありますか?

私は2つのコミット間の違いを見たいのですが、一方または他方に存在しないパス(追加/削除)を除外したいです。 次のPerlのワンライナーは、私が欲しいもののほとんどを例示しています。

git diff master.. | perl -lnwe 'print unless /^(new|deleted) file/../^diff/ and not /^diff/'

しかし、これでは diff --git a/path b/path の行が残ります。 さらに、パースする必要がなければ、もっとすっきりします (たとえば、ハンクが /^diff/ に一致するものを含んでいる場合も失敗します)。

私が試した別の代替案は

git diff --name-status (args) | perl -lnwe 'print if s/^M\s+//' | xargs git diff (args) --

出力は良くなったが、まだハック的な感じがする。

どのように解決するのですか?

あなたが探しているのは --diff-filter=M でファイル * を表示します。 M *2つのブランチの間で変更されたファイルのみを表示します。

から man git-diff

<ブロッククオート

--diff-filter=[ACDMRTUXB*]

のファイルのみを選択します。

  • A 追加
  • C コピー
  • D 削除
  • M 変更
  • R 名前変更
  • T タイプ(モード)が変更される
  • U アンマージド
  • X 不明
  • B ペアリングが壊れている
  • * オールオアナッシング

フィルター文字の組み合わせは自由です。

組み合わせに * (All-or-none) が追加された場合、すべてのパスが選択されます。 比較の他の条件に一致するファイルがある場合は、すべてのパスが選択されます。 他の条件に一致するファイルがない場合は、何も選択されません。 が選択されます。