変更された行のみを表示するGit diff


128

git diffを実行すると、追加された行が表示されます。

+ this line is added

削除された行:

- this line is removed

ただし、変更されていない多くの行も表示されます。

this line is not modified
this line is also not modified

これにより、実際のgit diffは次のようになります。

+ this line is added
  this line is not modified
- this line is removed
  this line is not modified

変更された行のみを表示し、変更されていない他のすべてのコードを無視するようにgitに要求できますか?その前に「+」または「-」記号のないすべての行を削除するメソッドを記述しましたが、これを行う簡単な方法があるはずです。

私のgit diffでは、変更された行を確認することだけに関心があります。

前もって感謝します。

回答:


182

必要なのは、0行のコンテキストを持つ差分です。これは次のようにして生成できます。

git diff --unified=0

または

git diff -U0

これをそのリポジトリの設定オプションとして設定することもできます:

git config diff.context 0

すべてのリポジトリに対してグローバルに設定するには:

 git config --global diff.context 0

4
迅速な返信ありがとうございます。これは私の問題の半分を解決しますが、diffに「@@ -1 +1 @@」のような行がまだあり、git diffの先頭には「diff --git a / db / xxxxxxx b / db / xxxx index」がありますxxxxx..aaaaaaa bbbbbbbb
r3b00t

3
私はgitがそれらの行を出力しないようにする方法を提供していないと思います。なぜなら、diffはそれらなしでは意味をなさないからです(どのファイルを見ているのか、どこにいるのかわからないため)。
Chris Hayes

8
@Rakesh:展開するために、git-diffはソースファイルへのパッチとして実際に使用できるdiffを作成しようとしますが、その情報なしでは不可能です。それを削除する唯一の方法は、viaのように自分で後処理することgit diff | egrep "^(\+|-) "です。
Chris Hayes

1
git config --global diff.context 0 グローバルに設定するには
Andrzej Rehmann、2015

特定のディレクトリで表示したい場合は、git diff -U0 <dir>を試してください
Eswar Yaganti

41

+and un -:で始まる行のみを表示する別のハック(un * x上):

git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'

上記のコードは次のことを行います。

  • git diff -U0:0のコンテキスト行を選択
  • 最初のgrepには、+orで始まるすべての行のみが含まれます-
  • 2番目のgrepは、--- a/orで始まる行を除外します+++ b/

色付きの差分を表示するには、次のことを試してください。

git diff -U0 --color | grep '^\e\[[^m]*m[-+]' | grep -Ev '(--- a/|\+\+\+ b/)'
  • 式、は^\e\[[^m]*m[-+]、行の開始(^)、次にエスケープ文字(\e)、続い[てエスケープシーケンスを開始し、次に「m」ではない文字(数字、セミコロン、または何もない)を探し、その後に「エスケープシーケンスを終了するm "。
  • 次のすべてが有効なエスケープシーケンスであることに注意してください:(\e[0mリセット)、\e[m(リセットも)、\e[1m(太字オン)、\e[31m(赤)、\e[32m(緑)、\e[9;31m(取り消し線+赤)、\e[31;9m(赤+取り消し線)、\e[1;4;9;31m(太字+下線+取り消し線+赤)。デフォルトのgitカラーは赤と緑を使用しますが、再構成できます。
  • --colorと同じ--color=alwaysです。
  • エスケープシーケンスに対応するために、行の先頭--- a/または+++ b/行の先頭に表示される制限が削除されました。これにより、大文字と小文字が区別される場合があります。

その他の注意事項:

  • 次のような追加のgit diffのオプションを使用する場合、上記の溶液を変更する必要があり-R--src-prefix--dst-prefix--no-prefix、など
  • 2つのgrepを1つにまとめることができますが、2つのgrep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'grepバージョンの方が理解しやすいと思います。

2
良いですね。各フィルターの明確な説明に賛成票を投じてください。
henrebotha 2017年

git diffで始まる「ヘッダー」タイプの行がたくさんありますが、またはで始まる行@@は何ですか?私はそれらのことを知りませんでした。git diff---+++
ガブリエルステープルズ

ああ、気にしないで。これらは、追加(+++)または削除(---)を含むファイルのファイル名を示します。私はそれを今ここに見ます:git-scm.com/docs/git-diff#_combined_diff_format
ガブリエルステープルズ

もう一度訂正:--- a/filename「左側のファイル」または以前の+++ b/filenameファイルを示しているように思われ、「右側のファイル」または変更された状態のファイルを示しているようです。私はgit difftoolmeldでの使用に慣れているので、美しい並べて比較ができるので、実際にに慣れたgit diffことはありません。
ガブリエルステープルズ

1
@GabrielStaples、色のサポートが追加されました。ありがとう。
user650654

6

Chrisの最新のコメントに続いて、後処理の主な問題は、行を先頭に置いておきたいが、で始まる行-|+を除外したいということ---|+++です。一方、リポジトリにパッチファイルを保存している場合(私はPydoop行います)、で始まる行を保持したい--|++ので、正規表現は少し複雑になります。

git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'

正規表現は否定的な先読みを使用します。詳細な説明については、この質問に対するPeter Boughtonの回答を参照してください。

これを頻繁に行う場合は、gitエイリアスを設定することをお勧めします。

git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'

1
これは、Windows git bashでは動作しませんでした。理由がわからない(grepは無効なオプションPと言った)、現時点ではそれを調べるためのchutzpahを持っていない。
デニス

1
-Pまたは--perl-regexp、パターンをPerlの正規表現として解釈するために使用されますが、常に実装されているわけではありません。OSXでは動作しませんでした。gnu.org/software/grep/manual/grep.html#grep-Programs
Willington Vega

4

私は単純な場合のために正規表現を使用して、ラインの変更がある場合は、この作業はライン自体で始まるない場所という警告と、はるかに短いと覚えやすいことができると思います+-

$ git diff | grep '^[+|-][^+|-]'

正規表現は、行が+or -で始まる必要があり、直後の文字はそれらのどちらでもないはずであると述べています。+ここでエスケープしたかどうかにかかわらず、同じ結果が得られました。


例:

$ cat testfile
A
B
C
D
E
F
G

セイIの変更CXEY、とGしますZ

$ git diff | grep '^[+|-][^+|-]'
-C
+X
-E
+Y
-G
+Z

上記で述べたように、これはほとんどの場合に当てはまります。その出力をファイルにパイプしてdout、同じ正規表現を試しても、機能しません。

$ git diff dout | grep '^[+|-][^+|-]'
$

とにかく、それがあなたの場合に役立つことを願って


行が「-」で始まる場合は機能しません。例:- name: No pdb yamlファイル内。
anapaulagomes

3

この回答は、読みやすくするために元の赤/緑の色を保持します。構文にいくつかのバリエーションを提供しました:

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\033のようにESC文字。

これをありがとう。これが私が思いついた別のフォームです。あなたの$''役割は特に私を助けてくれました。stackoverflow.com/a/61929887/4561887
ガブリエルステープルズ

1

との行awkだけを表示するために使用する方法、色またはテキストの書式設定を考慮して出力される場合があります。+-git diff

ここにある他の回答(私の他の回答を含む)のどれも、あなたが望むものを100%正確に正確に実行するわけではありません。ただし、この答えは可能です。これは、コピーしてターミナルに貼り付けることができる1ライナーです。読みやすくするために複数行にしました。どちらでも同じようにコピーして貼り付けることができるので、読みやすくすることもできます。それはawkプログラミング言語に依存しています:

git diff --color=always "$@" | awk '
# 1. Match and then skip "--- a/" and "+++ b/" lines
/^(\033\[(([0-9]{1,2};?){1,10})m)?(--- a\/|\+\+\+ b\/)/ {
    next 
} 
# 2. Now print the remaining "+" and "-" lines ONLY! Note: doing step 1 above first was required or
# else those lines would have been matched by this matcher below too since they also begin with 
# the "+" and "-" symbols.
/^(\033\[(([0-9]{1,2};?){1,10})m)?[-+]/ {
    print $0 
}
' | less -RFX

ここにその特徴があります。これらの機能をすべて組み合わせると、ここで他のすべての回答の欠点を解決できます。

  1. カラーとカラーなしの出力を処理します。これが、この正規表現が行うことです。^(\033\[(([0-9]{1,2};?){1,10})m)?
  2. 太字、斜体、取り消し線など、設定で設定できるすべての色とすべてのテキストの書式設定オプションを処理しますgit config。それが上記の正規表現がある理由であり;?{1,10}それに:それは色やテキストの書式コードの開始を検出した場合、それはこれらの組み合わせANSIコードの10個の配列に一致します。
  3. また、で始まる行は含まれていません@@し、単語diffとして、受け入れられた答えはありませんが。これらの行が必要な場合(率直に言って、これは便利だと思います:))、代わりに次のようにします。

    git diff --unified=0
    

    または

    git diff -U0
    
  4. 正確に同じように出力を表示しますgit difflessオプションのカラー出力(-R)を備えたページャーで、テキストが> 1ページ(-F)の場合のみ、そしてquit(-X)時に画面上のテキストの現在のページを保持します。

また、awkプログラミング言語を使用しているため、強力で簡単に構成できるという利点もあります。

awkの学習に興味がある場合は、次のリソースをご覧ください。

  1. gawk(GNU awk)マニュアル:https : //www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents
  2. 調査git diffnとそのコメント:https : //github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.sh
    1. 行番号git diffngit diff一緒にしたい場合は、ここを参照してください:行番号付きのGit diff(行番号付きのGitログ)
  3. awkの「hello world」と構文テストの例:https : //github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/tree/master/awk

おまけとして、上記をまとめてとして使用しましたgit diffc。これは、「git diffで「c'hangesのみを表示」することを意味します。使い方は同じgit diffgit diffc代わりに使用してください!すべてのオプションをサポートしています。カラーはデフォルトでオンです。オフにするには、git diffc --no-colorまたはを使用しますgit diffc --color=never。見るman git diffについては、をしてください。

私は昨夜(line 'n'umbersでgit diffn表示するツール)を終えたばかりなのでgit diff、書くのgit diffcは簡単でした。知識が頭の中で新鮮なうちに、今やった方がいいと思った。

インストールgit diffc

この回答の最後にある手順に従ってください。手順に記載されている箇所を除きgit-diffngit-diffc代わりに使用してください。wgetコマンドにも含まれています。ダウンロードとインストールgit diffcは簡単です:それはほんのいくつかのコマンドです。


0

次に、変更された行のみを検索する簡単な方法を示します。これにより、カラー出力を保持したまま、単一の+or -で始まります。

git diff -U0 --color=always HEAD~ | grep --color=never -E $'^\e\[(32m\+|31m-)'
  1. -U0ちょうど変更された行に自分自身を含める: -すなわち変更された行の周りのコンテキストの0ラインを含めるように述べています。を参照してくださいman git diff
  2. -Egrepのための拡張正規表現との仕事にそれを可能に
  3. $''構文は明らかにANSIが正しく適切にESC(エスケープ、またはとして0x1B)の文字を解釈する、引用できます。こちらをご覧ください
  4. そして、https://www.regex101.comからの正規表現の説明は次のとおりです。ここに画像の説明を入力してください
  5. 基本的に、^行の先頭に\e一致し、端末のカラーコードの開始であるエスケープ文字に\[一致し、カラーコードの次の文字に一致[(this|that)ます。次に、構文は「this」または「that」に一致します。ここで、「this」は32m+、緑色の+線と31m-赤色-線です。
  6. 色は次のようなものです:\e[32m緑と\e[31m赤です。
  7. +git diffもちろん、としてマークされた行が追加され、-によってマークさgit diffれた行が削除されたことを示します。
  8. 注意--color=neverされる必要な 2にgrep別段から入ってくるカラーコード台無しになり、そのマッチ、ハイライトを防止するために、発現git diff左にします。
  9. +あまりにもエスケープする必要があり\+そうでないので、+指定の特別な正規表現(正規表現)文字である、先行する要素の1回以上の繰り返しを。こちらをご覧くださいhttps : //en.wikipedia.org/wiki/Regular_expression#Basic_concepts

参照:

  1. https://git-scm.com/docs/git-diff#_combined_diff_format
  2. @ user650654による回答:変更された行のみを表示するGit diff
  3. @wisbuckyによる回答:変更された行のみを表示するGit diff

関連:

  1. [自分の回答] 行番号付きのGit差分(行番号付きのGitログ)
  2. [誰か他の人の答え] 行番号付きのGit差分(行番号付きのGitログ)
  3. 行番号と適切なコードの配置/インデント付きのgit diff
  4. git-filechange-search.sh-変数または関数名のファイルを検索し、その変数または関数名の変更を含むコミットを特定できるスクリプト。例 使用法:含まれているfile.cppへの変更を含む./git-filechange-search.sh path/to/my/file.cpp variable_nameすべてのコミットを検索variable_nameします。これは、特定の機能がいつどこで変更されたかを確認するのに役立ちます。git blame時間の経過とともに表示されるファイルのセクションを観察できる検索であるかのようです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.