How can I calculate the number of lines changed between two commits in Git?
git diff --shortstat
gives you just the number of lines changed and added. This only works with unstaged changes. To compare against a branch:
git diff --shortstat some-branch
You want the --stat
option of git diff
, or if you're looking to parse this in a script, the --numstat
option.
git diff --stat <commit-ish> <commit-ish>
--stat
produces the human-readable output you're used to seeing after merges; --numstat
produces a nice table layout that scripts can easily interpret.
I somehow missed that you were looking to do this on multiple commits at the same time - that's a task for git log
. Ron DeVera touches on this, but you can actually do a lot more than what he mentions. Since git log
internally calls the diff machinery in order to print requested information, you can give it any of the diff stat options - not just --shortstat
. What you likely want to use is:
git log --author="Your name" --stat <commit1>..<commit2>
but you can use --numstat
or --shortstat
as well. git log
can also select commits in a variety other ways - have a look at the documentation. You might be interested in things like --since
(rather than specifying commit ranges, just select commits since last week) and --no-merges
(merge commits don't actually introduce changes), as well as the pretty output options (--pretty=oneline, short, medium, full...
).
Here's a one-liner to get total changes instead of per-commit changes from git log (change the commit selection options as desired - this is commits by you, from commit1 to commit2):
git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'
(you have to let git log print some identifying information about the commit; I arbitrarily chose the hash, then used awk to only pick out the lines with three fields, which are the ones with the stat information)
For the lazy, use git log --stat
.