有没有简单的方法来计算Git中两次提交之间更改的行数?
我知道我可以做一个git diff,并计算行数,但这似乎很乏味。我还想知道我如何做到这一点,只包括我自己在行中的提交计数。
git diff
git diff --stat commit1 commit2
编辑:您还必须指定提交(没有参数,它会将工作目录与索引进行比较)。例如。
git diff --stat HEAD^ HEAD
将HEAD的父级与HEAD进行比较。
HEAD
您需要git diff的--stat选项,或者如果您希望在脚本中解析它,则需要--numstat选项。
--stat
--numstat
git diff --stat <commit-ish> <commit-ish>
--stat生成您习惯在合并后看到的人类可读的输出;--numstat生成脚本可以轻松解释的漂亮表格布局。
不知何故,我错过了你想要同时在多个提交上执行此操作——这是git log的任务。Ron DeVera谈到了这一点,但你实际上可以做的比他提到的要多得多。由于git log在内部调用diff机制以打印请求的信息,你可以给它任何diff统计选项——而不仅仅是--shortstat。你可能想要使用的是:
git log
--shortstat
git log --author="Your name" --stat <commit1>..<commit2>
但是您也可以使用--numstat或--shortstat。git log还可以通过各种其他方式选择提交——看看留档。您可能对--since(而不是指定提交范围,从上周开始选择提交)和--no-merges(合并提交实际上不会引入更改)以及漂亮的输出选项(--pretty=oneline, short, medium, full...)感兴趣。
--since
--no-merges
--pretty=oneline, short, medium, full...
这是一个单行代码,用于从git log获取总更改而不是每次提交更改(根据需要更改提交选择选项-这是您的提交,从提交1到提交2):
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只挑出带有三个字段的行,这是带有统计信息的行)
假设您想比较abcd123(第一次提交)和wxyz789(最后一次提交)之间的所有提交,包括:
git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"
这给出了简洁的输出,如:
abcd123 Made things better3 files changed, 14 insertions(+), 159 deletions(-)wxyz789 Made things more betterer26 files changed, 53 insertions(+), 58 deletions(-)
对于懒惰的人,使用git log --stat。
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 code1 file changed, 5 insertions(+), 5 deletions(-)ba8d29402 Fix review2 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
泛型-使用您需要的最后多次提交的计数更改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=yesterdaytotal: 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。
$@
--author="Brian"
--since=yesterday
转义awk将其放入git别名很混乱,所以我将其放入我路径(~/bin/git-stat-sum)上的可执行脚本中,然后在我的.gitconfig中的别名中使用脚本:
~/bin/git-stat-sum
.gitconfig
[alias]summary = !git-stat-sum \"$@\"
它工作得很好。最后要注意的一件事是file changes是文件更改的数量,而不是更改的唯一文件的数量。这就是我一直在寻找的,但可能不是你所期望的。
file changes
再举一两个例子
git summary --author=briangit summary master..dev# combine them as you likegit summary --author=brian master..devgit summary --all
实际上,您应该能够将任何git log命令替换为git summary。
git summary
如果您想查看更改,包括在您的分支和另一个分支之间更改的#行,
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 --stat
git diff | diffstat -Cm
这将为您提供相同的输出,除了它将[尝试]区分添加+删除的行和修改行。