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

Posted

技术标签:

【中文标题】如何计算 Git 中两次提交之间更改的行数?【英文标题】:How can I calculate the number of lines changed between two commits in Git? 【发布时间】:2011-02-01 10:56:14 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:
git log --numstat 

只给你数字

【讨论】:

【参考方案2】:

很好的总结一年

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

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

【讨论】:

【参考方案3】:

关于最后一次提交的简短统计:

git diff --shortstat HEAD~1 HEAD

就我而言,这给了我以下信息:

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

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

【讨论】:

【参考方案4】:

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

使用提交 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)'

【讨论】:

【参考方案5】:

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

git diff the_other_branch_name --stat

【讨论】:

【参考方案6】:

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

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

底层命令如下所示:

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

注意日志命令中的$@ 以传递您的参数,例如--author="Brian"--since=yesterday

转义 awk 以将其放入 git 别名中很麻烦,因此,我将其放入路径 (~/bin/git-stat-sum) 上的可执行脚本中,然后在我的 .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

【讨论】:

它应该是公认的答案,因为它是唯一真正回答它的答案:求和以显示更改的总行数。其他响应显示每行或每次提交的总数,但不汇总它们。您应该通过将“$@”替换为“..”来改进它。 这里是转义后用于 git 别名 summary = "!git log --numstat --format=\"\" \"$@\" | awk 'files += 1ins += $1del += $2 ENDprint \"total: \"files\" files, \"ins\" insertions(+) \"del\" deletions(-)\"' #" 的命令 如果您将脚本命名为git-summary 并且它在您的路径中,您可以call it as git summary without the alias。【参考方案7】:
git diff --shortstat

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

git diff --shortstat some-branch

【讨论】:

酷!但是..请注意,这仅适用于未分阶段的更改 如果您使用git add 进行了更改,请务必使用git diff --shortstat --cached 2463 个文件被更改,39745 个插入(+),21383 个删除(-)我实际上在上个月删除了大约 5k 到 10k。除了搬东西外,这几乎是我一直在做的所有事情。出了点问题。它不包括已删除的文件或其他内容? @jgmjgm,尝试在命令中使用git merge-base。你可能只是有一个比你的feature_branch 最初基于的新的master 分支,所以你需要对你的特性分支所基于的旧基础做git diff。这可以通过git merge-base 找到,如下所示:示例命令:git diff --shortstat $(git merge-base HEAD master) HEAD。样本输出:13 files changed, 955 insertions(+), 3 deletions(-)。好的。这是正确的。这:git diff --shortstat master,然而,显示:1643 files changed, 114890 insertions(+), 16943 deletions(-) shortstats 不显示行数,而是字符数【参考方案8】:

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

下面是获取最近 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'未被识别为内部或外部命令、可运行程序或批处理文件。”【参考方案9】:

对于懒惰的人,请使用git log --stat

【讨论】:

我发现这很有用,添加了 -10 以显示前十次提交。 查看完提交历史后,输入Q 返回终端。【参考方案10】:

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

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

【讨论】:

【参考方案11】:

您需要git diff--stat 选项,或者如果您希望在脚本中解析它,请使用--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 还可以通过其他各种方式选择提交 - 看看 documentation。您可能对--since(而不是指定提交范围,只需选择自上周以来的提交)和--no-merges(合并提交实际上不会引入更改)以及漂亮的输出选项(--pretty=oneline, short, medium, full... )。

这是一个获取全部更改而不是从 git log 中每次提交更改的单行程序(根据需要更改提交选择选项 - 这是您从 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打印一些关于commit的识别信息;我随意选择了hash,然后用awk只挑出了三个字段的行,就是那些有stat信息的行)

【讨论】:

这没有回答关于“换行”的原始问题。一个行更改被计算为插入和删除的行。计算更改的行数需要比这里描述的更多的工作。 @VilleLaitila:这是您无需付出大量努力即可获得的最接近的结果,对于 OP 和其他 15 个人来说已经足够了。 (您如何定义更改的行何时变为添加的行和删除的行?通过 - 和 + 行之间的编辑距离,作为行长度的一部分?)我们都知道更改会加倍;我们可以称之为变化量的有用指标,然后继续我们的生活。 git diff --shortstat &lt;commit1&gt; &lt;commit2&gt; 是我想要的。 作为参考,--since--until 的日期格式类似于:yesterday1 month 2 weeks 3 days 1 hour 1 second ago1979-02-26 18:30:00 @Bryson 是的,这就是为什么那行说&lt;commit-ish&gt; - 它适用于任何表示提交的东西,包括文字提交、分支、标签和一般的引用。另见***.com/questions/23303549/…【参考方案12】:

假设您要比较 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 并且没有其他参数是正确的)。 这也发生在我身上。这两个提交的顺序错误,交换它们来修复它。 更新了提交顺序并明确了两个 SHA 代表什么。谢谢你抓住它:) --shortstat 标志很棒,但它适用于git diff(不是git log)。 如何总结?【参考方案13】:
git diff --stat commit1 commit2

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

git diff --stat HEAD^ HEAD

HEAD 的父级与HEAD 进行比较。

【讨论】:

从来没有真正需要使用diff-index - diff 前端可以处理所有事情;我相信diff-index 的情况由--cached/--staged 覆盖。 (并且没有办法使用 diff-index 来比较 OP 要求的两个任意提交。) 这个输出对我来说没什么。 @Mike:你留了一克拉吗?您最近的提交是合并提交吗?如果 git 说没有差异,那是因为没有差异。 或者如果未提交git diff --stat HEAD 此外,您可以使用HEAD~n 来比较比父级更远的位置,其中n 是您想要返回的距离。 git diff --stat HEAD~5 HEAD 将显示与 HEAD 相关的最后 5 次提交的组合统计信息。

以上是关于如何计算 Git 中两次提交之间更改的行数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 git 中显示作者贡献的统计信息?

git:显示两次提交之间所有更改的文件

如何撤消两次提交之间的更改?

如何仅列出在两次提交之间更改的文件的名称

计算 git 存储库中的行数

如何在一个 submitHandler 中两次更新反应状态