git showの行を追加、変更、削除する方法はありますか?


110

「git diff --stat」と「git log --stat」は、次のような出力を表示します。

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
 app/controllers/application_controller.rb |   34 +++-------------------------
 1 files changed, 4 insertions(+), 30 deletions(-)

しかし、そのコミットで実際に起こったことは、4行が変更されて26行が削除されたことです。これは、4行を追加して30行を削除するのとは異なります。

デルタLOC(この場合は26)を取得する方法はありますか?追加または削除された行を区別する必要はありません。

回答:


127

以下を使用できます。

git diff --numstat

数値の差分情報を取得します。

変更を追加と削除のペアから分離することは、--word-diff役立つかもしれません。あなたはこのようなことを試すことができます:

MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

少し時間がかかるので、代わりに独自のスクリプトで解析することをお勧めします。


2
quornianに感謝しますが、numstatはstat、追加、削除とまったく同じ情報を提供します。
ファンアロンソ

の使用例を含むように私の回答を更新しました--word-diff。それはもっと便利かもしれません。
クアルニアン2012

14
の出力はgit diff --numstatファイルごとに分類されます。:合計差分のための追加/削除を確認するには、あなたはAWKへのパイプそれをすることができますgit diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
ヒューズ

15
@hughes同じ情報を取得するより簡単な方法は、次のようになりますgit diff --shortstat。私の経験では、の出力を累積することと同じですgit diff --numstat
klaus triendl

1
また、FWIWは段階的な変更の統計を表示し、単に追加します--cached
xlm

65
  1. id commit-idでのコミットによって追加/変更/削除された行を知りたい場合は、

    git show commit-id --stat
    

    または

    git diff commit-id-before commit-id --stat
    
  2. 範囲コミットによって追加/変更/削除された行を知る場合は、次を使用できます

    git diff commit-id1 commit-id2 --stat
    
  3. コミットごとに追加/変更/削除された行を知りたい場合は、

    git log --stat
    

その解決策は質問に答えません、「git --stat」は1つの変更された行を「1つの挿入と1つの削除」として数えます。質問は、「1を変更する」方法を尋ねます。
ファンアロンソ

6

すべてのファイルがコミット用にステージングされている場合は、次のように表示されます--numstat

git diff --numstat HEAD~

4

gitは、行の追加と削除のみが行われた「統一された」diffをdiff形式として使用します。追加、削除、変更情報を示す差分を取得するには、外部で何かを行う必要があります。

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Gitは、通常の古い「diff」の実行を許可するスクリプトへのリンクを提供し、そこから「context」diff出力を生成できます。Context diffは、追加、削除、および変更された行を表示します。これにより、必要なデータを取得できます。


3

diffstat変更された行の数を表示するために使用できます。例えば:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

-Cオプションはcolourised出力を得るためのものです。-mオプションが変更された行数を示すためのものです。出力例:

 app/controllers/application_controller.rb |   30 -------------------!!!
 1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)

変更された行数のカウントは、次のように概算man diffstatです。

-m パッチファイルの各「チャンク」から挿入/削除カウントをマージして、変更された行のカウントを概算します。

git diff --statdiffstat:の大きな違いの1つは、diffstatファイルの移動/名前変更(例:)を示しませんapp/{a.rb => b.rb}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.