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

Mik*_*ike 682 git

有没有简单的方法来计算git中两次提交之间更改的行数?我知道我可以做git diff,并计算线条,但这似乎很乏味.我也想知道如何做到这一点,包括我自己在行计数中的提交.

Cas*_*bel 1027

您需要--stat选项git diff,或者如果您希望在脚本中解析此--numstat选项.

git diff --stat <commit-ish> <commit-ish>
Run Code Online (Sandbox Code Playgroud)

--stat产生您在合并后习惯看到的人类可读输出; --numstat产生一个很好的表格布局,脚本可以轻松解释.

我不知何故错过了你想要同时在多次提交上做这件事 - 这是一项任务git log.Ron DeVera对此有所了解,但实际上你可以做的比他提到的要多得多.由于git log内部调用diff机器以打印请求的信息,因此您可以为其提供任何diff stat选项 - 而不仅仅是--shortstat.您可能想要使用的是:

git log --author="Your name" --stat <commit1>..<commit2>
Run Code Online (Sandbox Code Playgroud)

但你也可以使用--numstat或者--shortstat.git log也可以通过其他各种方式选择提交 - 查看文档.您可能对以下内容感兴趣--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)}'
Run Code Online (Sandbox Code Playgroud)

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

  • `git diff --shortstat <commit1> <commit2>`是我想要的那个. (165认同)
  • @VilleLaitila:这是尽可能接近没有荒谬的努力,对OP和其他15人来说已经足够了.(如何定义更改的行何时成为添加的行和删除的行?通过编辑 - 和+行之间的距离,作为行长度的一部分?)我们都知道变化加倍; 我们可以称之为变化量的有用指标,并继续我们的生活. (11认同)
  • 作为参考,`--since`和`--until`的日期格式类似于:`昨天`,`1个月2周3天1小时1秒前',或者`1979-02-26 18:30 :00` (8认同)
  • 这不能回答有关“更改的行”的原始问题。一行更改被计算为插入和删除的行。计算更改的行数需要比这里描述的更多的工作。 (4认同)
  • @Bryson是的,这就是为什么这行代表`<commit-ish>` - 它适用于*代表*提交的任何东西,包括文字提交,分支,标签和refs.另见http://stackoverflow.com/questions/23303549/what-are-commit-ish-and-tree-ish-in-git (3认同)
  • `git diff --shortstat HEAD~1 HEAD` 做了我需要的,谢谢@Kim (2认同)

Tho*_*mas 176

对于懒惰,使用git log --stat.

  • 也适用于`git log --shortstat`. (27认同)
  • 我发现这很有用,添加了一个`-10`来显示前十次提交. (11认同)
  • 查看完提交历史记录后,请输入Q以返回到终端。 (2认同)

ork*_*den 149

git diff --shortstat
Run Code Online (Sandbox Code Playgroud)

为您提供更改和添加的行数.

  • 如果您使用“git add”暂存更改,请确保执行“git diff --shortstat --cached” (9认同)
  • 凉!但是..请注意,这仅适用于未分级的更改 (3认同)
  • @JHBonarius根据文档, --shortstat 显示行,而不是字符:https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---shortstat (3认同)
  • @jgmjgm,尝试使用 `git merge-base` 作为命令的一部分。您可能只是拥有一个比您的“feature_branch”最初所基于的更新的“master”分支,所以您需要针对您的功能分支所基于的旧基础执行“git diff”。这可以通过 `git merge-base` 找到,如下所示:示例命令:`git diff --shortstat $(git merge-base HEAD master) HEAD`。示例输出:“13 个文件已更改,955 个插入(+),3 个删除(-)”。好的。这是正确的。然而,“git diff --shortstat master”显示:“1643 个文件已更改,114890 个插入(+),16943 个删除(-)”。 (2认同)
  • Shortstats 不显示_行_数,而是__字符_数! (2认同)

Mat*_*hen 45

git diff --stat commit1 commit2
Run Code Online (Sandbox Code Playgroud)

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

git diff --stat HEAD^ HEAD
Run Code Online (Sandbox Code Playgroud)

比较的父HEADHEAD.

  • 或者如果是uncommited`git diff --stat HEAD` (6认同)
  • 或者`git diff --stat HEAD ^!` (2认同)

Spy*_*yto 45

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

git diff --shortstat HEAD~1 HEAD
Run Code Online (Sandbox Code Playgroud)

就我而言,这为我提供了以下信息:

 254 files changed, 37 insertions(+), 10773 deletions(-)
Run Code Online (Sandbox Code Playgroud)

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


小智 20

总结这一年的好东西

git diff --shortstat <first commit number of the year> HEAD
Run Code Online (Sandbox Code Playgroud)

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


Ron*_*era 18

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

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"
Run Code Online (Sandbox Code Playgroud)

这给出了简洁的输出,如:

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

  • `--shortstat`标志很棒,它可以与`git diff`一起使用(不是`git log`). (3认同)

小智 13

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

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"
Run Code Online (Sandbox Code Playgroud)

输出:

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

使用长输出内容,您可以导出到文件以获得更多可读性

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt
Run Code Online (Sandbox Code Playgroud)


und*_*ned 12

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

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

底层命令如下所示:

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

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

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

[alias]
    summary = !git-stat-sum \"$@\"
Run Code Online (Sandbox Code Playgroud)

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

这是另外一两个例子

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all
Run Code Online (Sandbox Code Playgroud)

真的,您应该能够将任何git log命令替换为git summary.

  • 它应该是公认的答案,因为它是唯一真正回答它的答案:求和以显示更改的总行数。其他回复显示每行或每次提交的总数,但不总结它们。您应该通过将“$@”替换为“&lt;commit1&gt;..&lt;commit2&gt;”来改进它。 (2认同)
  • 以下是在 git 别名中使用的转义命令 `summary = "!git log --numstat --format=\"\" \"$@\" | awk '{files += 1}{ins += $1} {del += $2} END{print \"总计:\"files\" 文件,\"ins\" 插入(+) \"del\" 删除(-)\"}' #"` (2认同)
  • 如果您将脚本命名为“git-summary”并且它位于您的路径中,则可以[将其称为“git 摘要”而不带别名](https://www.atlassian.com/git/articles/extending-git)。 (2认同)

小智 11

git log --numstat 
Run Code Online (Sandbox Code Playgroud)

只给你数字


小智 5

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

git diff the_other_branch_name --stat
Run Code Online (Sandbox Code Playgroud)