有没有简单的方法来计算Git中两次提交之间更改的行数?

我知道我可以做一个git diff,并数行,但这似乎很乏味。我还想知道如何做到这一点,在行计数中只包括我自己的提交。


git diff --stat commit1 commit2

EDIT:您还必须指定提交(如果没有参数,它将工作目录与索引进行比较)。如。

git diff --stat HEAD^ HEAD

比较HEAD和HEAD的父类。


您需要git diff的——stat选项,或者如果您希望在脚本中解析它,则需要——numstat选项。

git diff --stat <commit-ish> <commit-ish>

——stat生成你习惯在合并后看到的人类可读的输出;——numstat生成一个很好的表布局,脚本可以很容易地解释。

我在某种程度上错过了你正在寻找在同一时间多次提交这样做-这是一个任务的git日志。Ron DeVera提到了这一点,但实际上你可以做的比他提到的多得多。因为git日志在内部调用diff机制来打印请求的信息,你可以给它任何diff stat选项——而不仅仅是——shortstat。你可能想用的是:

git log --author="Your name" --stat <commit1>..<commit2>

但你也可以使用——numstat或——shortstat。Git日志还可以以各种其他方式选择提交-请查看文档。您可能会对——since(而不是指定提交范围,只是选择上周以来的提交)和——no-merges(合并提交实际上不引入更改)以及漂亮的输出选项(——pretty=oneline, short, medium, full…)感兴趣。

这是一个一行程序,从git日志中获得所有更改,而不是每次提交的更改(根据需要更改提交选择选项-这是由你提交的,从commit1到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)}'

(你必须让git日志打印一些关于提交的识别信息;我任意地选择了哈希,然后使用awk只挑出带有三个字段的行,这是带有统计信息的行)


假设你想比较abcd123(第一次提交)和wxyz789(最后一次提交)之间的所有提交,包括:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

这将给出如下简洁的输出:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

对于懒惰的人,使用git log——stat。


git diff --shortstat

给出修改和添加的行数。这只适用于未分阶段的更改。与树枝比较:

git diff --shortstat some-branch

另一种获取指定时间段内所有更改日志的方法

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

输出:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

对于较长的输出内容,您可以将其导出到文件以获得更好的可读性

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

虽然以上答案都是正确的,但如果你需要计算最后提交的次数,下面的答案是方便的

下面一个是最近5次提交的计数

Git diff $(Git log -5——pretty=format:"%h" | tail -1)——shortstat

获取最近10次提交的计数

Git diff $(Git log -10——pretty=format:"%h" | tail -1)——shortstat

generic -用你需要的最后提交数改变N

git diff $(git log -N——pretty=format:"%h" | tail -1)——shortstat

获取自启动以来所有提交的计数

Git diff $(Git log——pretty=format:"%h" | tail -1)——shortstat


git log --numstat 

只给你数字


我刚刚为自己解决了这个问题,所以我将分享我的想法。这是最终结果:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

底层命令如下所示:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

注意log命令中的$@用来传递参数,比如——author="Brian"或——since=yesterday。

转逃awk并将其放入git别名中是很麻烦的,因此,我将其放入我的路径(~/bin/git-stat-sum)的可执行脚本中,然后在我的.gitconfig中使用别名中的脚本:

[alias]
    summary = !git-stat-sum \"$@\"

而且效果非常好。最后要注意的一点是,文件更改是文件更改的数量,而不是更改的惟一文件的数量。这就是我想要的,但可能不是你想要的。

这里还有一两个例子

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

实际上,你应该能够用git summary替换任何git日志命令。


如果您想查看更改,包括在您的分支和另一个分支之间更改的行号,

git diff the_other_branch_name --stat

如果你想检查两个分支或提交之间插入、删除和提交的数量。

使用提交id:

git log <commit-id>..<commit-id> --numstat --pretty="%H" --author="<author-name>" | awk 'NF==3 {added+=$1; deleted+=$2} NF==1 {commit++} END {printf("total lines added: +%d\ntotal lines deleted: -%d\ntotal commits: %d\n", added, deleted, commit)}'

使用分支:

git log <parent-branch>..<child-branch> --numstat --pretty="%H" --author="<author-name>" | awk 'NF==3 {added+=$1; deleted+=$2} NF==1 {commit++} END {printf("total lines added: +%d\ntotal lines deleted: -%d\ntotal commits: %d\n", added, deleted, commit)}'

关于上次提交的简短统计信息:

git diff --shortstat HEAD~1 HEAD

在我的例子中,这给了我以下信息:

 254 files changed, 37 insertions(+), 10773 deletions(-)

插入和删除是受影响的行。


用这个来总结这一年不错

git diff --shortstat <first commit number of the year> HEAD

获得结果270个文件更改,19175个插入(+),1979个删除(-)


Git diff——stat将重复计算修改的行。如果这对你来说是个问题,你可以这样做:

git diff | diffstat -Cm

这将给您相同的输出,除了它将[尝试]区分添加+删除的行和修改的行。


该命令将比较本地文件和远程文件

git diff --stat

我想让插入和删除进入和,以防其他人需要同样的东西:

# get the log      filter useless parts      calculate the sum    and print it
git log --numstat | grep -vE '^[^0-9]' | awk '{sum += $1 + $2} END {print sum}'

这并不像其他一些解决方案那样通用(例如一个未定义的帖子),但只给出了一个简单的数字,这对我的用例来说很好