如何计算git中两次提交之间更改的行数?


746

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

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


3
您看一下BitBucket。
Alex78191 '18

Answers:


1111

您需要使用的--stat选项git diff,或者如果您想在脚本中解析该--numstat选项,请使用该选项。

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

--stat生成合并后您经常看到的易于理解的输出;--numstat产生一个很好的表布局,脚本可以轻松地解释。

我莫名其妙地错过了您希望同时执行多个提交的操作-这是的任务git log。罗恩·德维拉(Ron DeVera)谈到了这一点,但实际上您可以做的比他提到的要多得多。由于git log内部调用了diff机制以打印请求的信息,因此您可以为它提供任何diff stat选项-而不仅仅是--shortstat。您可能想使用的是:

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

但您也可以使用--numstat--shortstatgit log也可以通过其他方式选择提交-看看文档。您可能对以下内容感兴趣--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 log打印有关提交的一些标识信息;我随意选择了哈希,然后使用awk仅选择了具有三个字段的行,这些字段是具有stat信息的行)


2
这不能回答有关“线变”的原始问题。一行更改被计算为插入行和删除行。计算更改的行数需要做的工作比这里描述的要多。
Ville Laitila

12
@VilleLaitila:这很接近您而无需花费很多努力,对于OP和15个其他人来说已经足够了。(如何定义更改的行何时变为添加的行和删除的行?通过编辑-和+行之间的距离(以行长的一部分表示)?)我们都知道更改会加倍;我们可以称之为变化量的有用指标,并继续我们的生活。
卡斯卡贝尔2012年

188
git diff --shortstat <commit1> <commit2>是我想要的那个
金(Kim)

9
作为参考,对于日期格式--since--until是一样的东西:yesterday1 month 2 weeks 3 days 1 hour 1 second ago1979-02-26 18:30:00
juanmirocks

4
@Bryson是的,这就是该行说的原因<commit-ish>-它可以与代表提交的任何内容一起使用,包括一般的字面提交,分支,标签和引用。另请参见stackoverflow.com/questions/23303549/…–
卡斯卡贝尔


180
git diff --shortstat

仅提供更改和添加的行数。这仅适用于未分段的更改。与分支进行比较:

git diff --shortstat some-branch

3
凉!但是..请注意,这仅适用于未分级的更改
TomCobo

3
如果您使用git add进行了更改,请确保执行git diff --shortstat --cached
TomNash

更改了2463个文件,插入了39745个(+),删除了21383个(-),实际上我在上个月删除了大约5k到10k。除了移动周围的东西,这几乎是我一直在做的事情。出了点问题。它不包括已删除的文件或其他内容吗?
jgmjgm

46
git diff --stat commit1 commit2

编辑:您还必须指定提交(不带参数,它将工作目录与索引进行比较)。例如

git diff --stat HEAD^ HEAD

比较的父HEADHEAD


1
从来没有真正需要使用diff-index- diff前端可以处理所有事情;我相信的情况diff-index已包含--cached/--staged在内。(而且diff-index正如OP所要求的,没有办法用来比较两个任意提交。)
卡斯卡贝尔

对于我而言,此输出无济于事。
Mike

@迈克:你离开克拉了吗?您最近的提交是合并提交吗?如果git说没有差异,那是因为没有差异。
卡斯卡贝尔

6
还是未提交git diff --stat HEAD
wieczorek1990

1
另外,您可以通过使用HEAD~n,而不只是父项进行进一步的比较,n您想返回多远。git diff --stat HEAD~5 HEAD将显示相对于HEAD的最后5次提交的合并统计信息。
内森·贝克

18

假设要比较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(-)

这个输出对我来说什么都没有(我已经提交并验证了--author通过与git log一起使用,并且没有其他参数,是正确的)。
Mike

这也发生在我身上。两次提交顺序错误,将它们交换来固定它。
bob esponja

1
更新了提交顺序,并阐明了两个SHA代表的含义。感谢您抓住它:)
Ron DeVera 2014年

3
--shortstat标志很棒,可与一起使用git diff(不是git log)。
lucke84

如何总结它们?
xpto

13

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

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

2

尽管以上所有答案都是正确的,但如果您需要计数最近的多次提交,则以下一个方便使用

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

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

获取最近10次提交的计数

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

通用-用您需要的最后多次提交的数量更改N

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

获取自开始以来所有提交的计数

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


这给出了“'tail'未被识别为内部或外部命令,可操作程序或批处理文件”。
查尔斯·罗迪


1

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

> 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)的可执行脚本中,然后在my的别名中使用脚本.gitconfig

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

而且效果很好。最后要注意的是,file changes文件更改的数量而不是唯一文件更改的数量。那就是我一直在寻找的东西,但可能并非您所期望的。

这是另外两个例子

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

确实,您应该能够用替换任何git log命令git summary

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.