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

     2023-02-21     53

关键词:

【中文标题】如何计算 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:显示两次提交之间所有更改的文件

gitdiff--name-onlySHA1SHA2 查看详情

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

】如何撤消两次提交之间的更改?【英文标题】:Howcaniundochangesbetweentwocommits?【发布时间】:2020-07-2800:17:30【问题描述】:我想在两次提交之间恢复一个文件更改,commit1hash:abcde1....somecodechangescommit2hash:abcde2....somecodechangescommit3has... 查看详情

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

】如何仅列出在两次提交之间更改的文件的名称【英文标题】:Howtolistonlythenamesoffilesthatchangedbetweentwocommits【发布时间】:2010-12-0520:35:42【问题描述】:我在存储库中有一堆提交。我想查看两次提交之间更改的文件列表-从SHA1到SH... 查看详情

计算 git 存储库中的行数

...nagitrepository【发布时间】:2011-06-1621:16:50【问题描述】:如何计算git存储库中所有文件的总行数?gitls-files给了我一个git跟踪的文件列表。我正在寻找cat所有这些文件的命令。类似的东西gitls-files|[catallthesefiles]|wc-l【问题讨论】... 查看详情

统计代码git提交的行数

$gitlog--author="$(gitconfig--getuser.name)"--pretty=tformat:--numstat|gawk‘{add+=$1;subs+=$2;loc+=$1-$2}END{printf"addedlines:%sremovedlines:%stotallines:%s ",add,subs,loc}‘- 统计某人的代码提交量,包括增加,删除 查看详情

如何使用opencv准确计算图像中的行数

】如何使用opencv准确计算图像中的行数【英文标题】:Howtoexactlycountthenumberoflinesinaimageusingopencv【发布时间】:2017-05-1106:16:44【问题描述】:如何准确计算数字之间的行数,总计数必须是6。我用这个方法用openCV统计行数,得到了... 查看详情

计算 SQL 中值转换之间的行数

】计算SQL中值转换之间的行数【英文标题】:CountingthenumberofrowsbetweentransitionsofvaluesinSQL【发布时间】:2021-01-2821:59:36【问题描述】:我有带有user_id、时间戳和是/否答案的行。我想计算每个ID有多少条“NO”(连续行)。例子:use... 查看详情

sh计算gitrepo#git中的行数(代码片段)

查看详情

HIVE/Impala 查询:计算满足特定条件的行之间的行数

】HIVE/Impala查询:计算满足特定条件的行之间的行数【英文标题】:HIVE/Impalaquery:Countthenumberofrowsbetweenrowsfulfillingcertainconditions【发布时间】:2017-11-1310:41:06【问题描述】:我需要计算满足某些条件的行数,这些条件包含在满足其... 查看详情

如何从 svn 获取提交的行数

】如何从svn获取提交的行数【英文标题】:howtogetcommitedrowcountsfromsvn【发布时间】:2012-12-0304:00:28【问题描述】:我需要获取每个用户在命令模式下提交的行数。我在Ubuntu机器上使用rabbitSVN。谁能帮我搞定这个我使用以下语法将... 查看详情

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

】如何在一个submitHandler中两次更新反应状态【英文标题】:HowtoupdatereactstatetwiceinonesubmitHandler【发布时间】:2018-10-2218:00:45【问题描述】:我想在React中提交一个表单,我试图用一个submitHandler更新状态两次。第二次更新依赖于第... 查看详情

如何在不使用循环的情况下更新 SQL Server 中两组不同条件之间的行

】如何在不使用循环的情况下更新SQLServer中两组不同条件之间的行【英文标题】:HowtoupdaterowsbetweentwodifferentsetsofcriteriainSQLServerwithoutusingaloop【发布时间】:2019-11-0915:47:20【问题描述】:问题:(SQLServer2014)。换句话说,对于结果... 查看详情

计算分钟时间间隔之间的行数-python(代码片段)

我想使用groupby函数计算30分钟时间间隔的行数,从第一个单元格向下列计算30分钟间隔。这是我有的:LOGINIDDATETIMEmickey1/1/20180days08:54:00.000000000mickey1/1/20180days08:57:00.000000000mickey1/1/20180days09:01:00.000000000mickey1/1/20180days09: 查看详情

Git:显示两次提交之间的总文件大小差异?

】Git:显示两次提交之间的总文件大小差异?【英文标题】:Git:showtotalfilesizedifferencebetweentwocommits?【发布时间】:2012-06-0609:16:08【问题描述】:是否可以显示两次提交之间的总文件大小差异?比如:$gitfile-size-diff7f3219bad418#Iwishth... 查看详情

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

】如何在git中显示作者贡献的统计信息?【英文标题】:HowdoIshowstatisticsforauthor\'scontributionsingit?【发布时间】:2017-07-3115:28:31【问题描述】:我正在与一个git项目的团队合作,我想查看每个作者在编写的行数或编辑的行数等方面... 查看详情

git log 包含另一个分支的提交,如何在分支之间分离提交

】gitlog包含另一个分支的提交,如何在分支之间分离提交【英文标题】:gitlogcontaincommitforanotherbranch,howtoseparatecommitbeweenbranch【发布时间】:2021-11-0614:52:44【问题描述】:如何分离分支之间的变化?例如:我创建了名为BRANCH-1的新... 查看详情

如何查找和计算两个不同数据帧之间的重复行数? [关闭]

】如何查找和计算两个不同数据帧之间的重复行数?[关闭]【英文标题】:Howtofindandcalculatethenumberofduplicatedrowsbetweentwodifferentdataframe?[closed]【发布时间】:2021-08-1106:26:09【问题描述】:我如何知道不同数据帧之间重复的行数?并... 查看详情

git:自动修复更改的行所属的提交

】git:自动修复更改的行所属的提交【英文标题】:git:fixupautomaticallythecommitachangedlinebelongsto【发布时间】:2017-10-2006:03:45【问题描述】:想象一下在评论中打错字或类似的东西:-//Dothigns+//Dothings现在,通过gitblame@--file,您会看... 查看详情