通常、diff
とgit diff
は、元の行と変更された行の両方をそれぞれ-
と+
で表示します。方法はありますか?変更された行を表示するためにのみフィルタリングできますか?これにより、読み取る行数が瞬時に2分の1に削減されます。
想定していた
git diff test.yml | grep '^+' | less -R
そして
git diff test.yml | egrep '^+' | less -R
同じ結果を得るために。つまり、ファイルに新しい追加が表示されます。ただし、egrep
はファイル全体を表示します。どうしてこんなことに?
とにかく上の方法だと色落ちしてしまいます。色を保持する方法はありますか?
--Word-diff
を使用すると、赤/緑のテキストを使用して強調表示された変更とともに+
および-
行を圧縮し、grepの使用をすべて停止できます。
これを-U0
と組み合わせて、diffをさらに凝縮したい場合は、diffの周りのすべてのコンテキストを削除できます。
このアプローチは、grepを使用するよりも優れています。出力が失われることはありません。行が追加されたとき、または単に変更されたときがわかり、出力を読みやすいものに圧縮しながら削除を完全に失うことはありません。
Egrepに関する質問への回答は、@ Stephen Kitt here によって既に回答されています。
egrep
は拡張正規表現を使用するため、
egrep ^+
1つ以上の行頭(+
は特殊文字です)。 「+」文字を一致させるには、エスケープする必要があります。
egrep ^\+
色を表示するには、git
に出力を強制する必要があります。デフォルトでは、パイプするときにそれらを無効にします。
git diff --color
これをフィルタリングするには、色に使用されるエスケープコードを考慮する必要があります。
git diff --color ... | egrep '^.[[[:digit:]]+m\+' | less -R
ただし、
egrep
はファイル全体を表示します。どうしてこんなことに?
egrep
は拡張正規表現を使用するため、egrep ^+
は各行の先頭に1回以上一致します(つまり、すべての行に一致します)。 egrep ^\+
を使用すると、+
で始まる行のみが一致します。
とにかく上の方法だと色落ちしてしまいます。色を保持する方法はありますか?
はい、オプション--color=always
を追加します:
git diff --color=always | less -R
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
grep
だけでも実行できます。
$ grep -xvFf filea.txt fileb.txt
これにより、1つのファイルから行が取得され、他のファイルでそれらが検索され、完全に一致しないファイルのみが出力されます。