Search code examples
gitgit-diff

Is there a way of having git show lines added, lines changed and lines removed?


git diff --stat and git log --stat show output like:

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

But what really happened in that commit was that 4 lines were changed and 26 lines were deleted which is different than adding 4 lines and deleting 30.

Is there any way of getting the delta LOCs (26 in this case)? I don't really care about differentiating between lines added or removed.


Solution

  • For per-file numerical diff information:

    git diff --numstat
    

    For aggregated numerical diff information:

    git diff --shortstat
    

    As far as separating modification from an add and remove pair, --word-diff might help. You could try something like this:

    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
    

    It's a little long-winded so you may want to parse it in your own script instead.