web-dev-qa-db-ja.com

git diff:変更された行のみを表示することは可能ですか

変更された行の新しいバージョンのみを取得しようとしていますが、git diffが表示する他のすべての情報は取得していません。

ために:

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix

それが示している:

diff --git file1 file2
index d9db605..a884b50 100644
--- file1
+++ file2
@@ -16 +16 @@ bla bla bla
-old text
+new text

私が見たいのは、

new text

出来ますか?

20
Artem

追加された行だけがすべての場合に意味をなすわけではありません。テキストのブロックを置き換えて、たまたまそこにあった1行を含めた場合、gitは一致して推測する必要があります。 -通常、git diffの出力は、後でpatchの入力として使用できるため、意味があります。 gitが推測しなければならない場合があるため、追加された行だけが正確に定義されていません。

それでもそれが必要な場合は、先頭の+記号だけを信頼することはできません。緑の線をすべてフィルタリングする方が良いでしょう:

git diff --color=always|Perl -wlne 'print $1 if /^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/'

すべての赤い線に対して削除された線フィルターのみ:

git diff --color=always|Perl -wlne 'print $1 if /^\e\[31m-(.*)\e\[m$/'

使用できる出力のカラーコードを検査するには:

git diff --color=always|Ruby -wne 'p $_'
14
michas

特にnew text部分のみが必要な場合は、以下を使用します。

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix | egrep "^\+"

これは基本的にはコードであり、正規表現を使用してegrepコマンドにパイプされます。正規表現は、プラス記号で始まる行のみをフィルタリングします。

6
metacubed

以下を使用できます。

git diff -U0 <commit-hash> | grep "^\+\""

これはあなたの出力を「+新しいテキスト」として与えます

3
Srini

これがgrepを使った答えです。読みやすいように、元の赤/緑の色を保持します。構文にいくつかのバリエーションを提供しました:

git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'

説明:

  • git diff --colorは、gitがパイピング時に色を無効にしないようにするために必要です。
  • grep --color=neverは、grepが一致した文字列を強調表示しないようにします(元のコマンドから元の色が削除されます)。
  • 赤(\e[31m)または緑(\e[32m)のエスケープコードで始まる行に一致します。
  • $'...'(ANSI-C引用構文)または-P(Perl構文)は、grep\eまたは\033ESC文字。
0
wisbucky