web-dev-qa-db-ja.com

変更されたファイルの追加のみを表示するdiff

通常、diffgit diffは、元の行と変更された行の両方をそれぞれ-+で表示します。方法はありますか?変更された行を表示するためにのみフィルタリングできますか?これにより、読み取る行数が瞬時に2分の1に削減されます。

想定していた

git diff test.yml | grep '^+' | less -R

そして

git diff test.yml | egrep '^+' | less -R

同じ結果を得るために。つまり、ファイルに新しい追加が表示されます。ただし、egrepはファイル全体を表示します。どうしてこんなことに?

とにかく上の方法だと色落ちしてしまいます。色を保持する方法はありますか?

7
infoclogged

--Word-diffを使用すると、赤/緑のテキストを使用して強調表示された変更とともに+および-行を圧縮し、grepの使用をすべて停止できます。

enter image description here

これを-U0と組み合わせて、diffをさらに凝縮したい場合は、diffの周りのすべてのコンテキストを削除できます。

enter image description here

このアプローチは、grepを使用するよりも優れています。出力が失われることはありません。行が追加されたとき、または単に変更されたときがわかり、出力を読みやすいものに圧縮しながら削除を完全に失うことはありません。

Egrepに関する質問への回答は、@ Stephen Kitt here によって既に回答されています。

5
Michael Daffin

egrepは拡張正規表現を使用するため、

egrep ^+

1つ以上の行頭(+は特殊文字です)。 「+」文字を一致させるには、エスケープする必要があります。

egrep ^\+

色を表示するには、gitに出力を強制する必要があります。デフォルトでは、パイプするときにそれらを無効にします。

git diff --color

これをフィルタリングするには、色に使用されるエスケープコードを考慮する必要があります。

git diff --color ... | egrep '^.[[[:digit:]]+m\+' | less -R
3
Stephen Kitt

ただし、egrepはファイル全体を表示します。どうしてこんなことに?

egrepは拡張正規表現を使用するため、egrep ^+は各行の先頭に1回以上一致します(つまり、すべての行に一致します)。 egrep ^\+を使用すると、+で始まる行のみが一致します。

とにかく上の方法だと色落ちしてしまいます。色を保持する方法はありますか?

はい、オプション--color=alwaysを追加します:

git diff --color=always | less -R
1
Satō Katsura

grepを使用すると機能しますが、フラグを使用して、同様の、場合によってはより簡潔な結果を得ることができます。


git diff

コンテキストの量を調整できますgit diff-U 国旗。 man git-diff

   -U<n>, --unified=<n>
       Generate diffs with <n> lines of context instead of the usual three. Implies -p.

git diff -U0は、変更ごとにコンテキストを持たない最小限/単純な出力を生成します。


diff

同じフラグがdiffにも適用されます。

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

例(diff -U0も同じように機能します):

$ diff -U0 <(echo -e "abc123\ndef345") <(echo -e "abc123\nghi678")
--- /dev/fd/63  2017-09-14 09:18:01.000000000 -0400
+++ /dev/fd/62  2017-09-14 09:18:01.000000000 -0400
@@ -2 +2 @@
-def345
+ghi678
1
h3rrmiller

grepだけでも実行できます。

$ grep -xvFf filea.txt fileb.txt

これにより、1つのファイルから行が取得され、他のファイルでそれらが検索され、完全に一致しないファイルのみが出力されます。

1
bodge