有没有办法让git显示添加的行、更改的行和删除的行?

196

git diff --statgit log --stat显示的输出如下:

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
app/controllers/application_controller.rb |   34 +++-------------------------
1 files changed, 4 insertions(+), 30 deletions(-)

但是在那个提交中真正发生的事情是有4行代码被修改了,26行代码被删除了,这与添加4行代码和删除30行代码是不同的。
有没有办法获取差异行数(在这种情况下是26行)?我并不关心区分添加或删除的具体行数。
5个回答

208
每个文件的数值差异信息:
git diff --numstat

对于聚合的数值差异信息:
git diff --shortstat

就分离修改与添加和删除对来说,--word-diff可能会有所帮助。你可以尝试类似这样的方法:
MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

这段话有点啰嗦,你可能想用你自己的脚本来解析它。

3
谢谢你的留言,quornian。但是numstat提供的信息与stat相同,都包括添加和删除的行数。 - Juan Alonso
谢谢!你修改后的答案很好。我想知道在两个特定提交之间添加/修改/删除了多少行代码。对于其他想要做同样事情的人,只需在命令中输入分支名称,如:git diff commit1 commit2 --word-diff ... 其中commit1/2是SHA1、分支、标签等。 - Drew Noakes
26
git diff --numstat 命令的输出结果是按文件拆分的。如果要查看差异的总添加/删除情况,可以将其导出至 awk: git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }' - hughes
58
获得相同信息的更简单方法是 git diff --shortstat。根据我的经验,它相当于累加 git diff --numstat 的输出结果。 - klaus triendl
5
如果你想查看暂存更改的统计信息,只需添加 --cached - xlm
显示剩余2条评论

116
  1. 如果你想知道提交ID为commit-id的提交所添加/更改/删除的代码行,可以使用以下命令:

git show commit-id --stat
或者
git diff commit-id-before commit-id --stat
  • 如果您想知道一系列提交中添加/更改/删除的行,请使用以下命令:

    git diff commit-id1 commit-id2 --stat
    
  • 如果你想知道每个提交增加/更改/删除的代码行数,可以使用

  • git log --stat
    

    5
    那个解决方案并没有回答这个问题,“git --stat”将单个修改的行数计为“1插入和1删除”。这个问题要求如何得到“1更改”。 - Juan Alonso

    30

    您可以使用diffstat来显示修改的行数。例如:

    git diff HEAD c9af3e6136e8 | diffstat -Cm
    

    -C选项用于获得彩色输出;-m选项用于显示修改行数。示例输出:

     app/controllers/application_controller.rb |   30 -------------------!!!
     1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)
    

    请注意,每个类别(插入、删除、修改)中的行数仅是近似值,如man diffstat所述:

    -m 合并补丁文件中每个“块”的插入/删除计数,以近似计算修改的行数。

    git diff --stat相比,diffstat缺少一个功能:无法显示文件移动/重命名(例如app/{a.rb => b.rb}),而git diff --stat可以通过使用-M--find-renames)选项或在git配置文件中设置diff.renames来显示此信息(请参阅man git-config)。

    1
    这个需要更多的赞,因为它实际上展示了修改!谢谢。 - gavs

    16

    如果您的所有文件都已准备好提交,要查看 --numstat 的结果,可以按照以下方式操作:

    git diff --numstat --cached
    

    示例输出

    32      32      project.pbxproj
    

    --numstat [...] 显示添加和删除的行数


    5

    3
    因为链接到一篇文章而被投票否决,而不是在这里复制相关信息。该文章不再包含相关部分。(诚然,它恰好是一个具有可用编辑历史记录的维基百科,但无论如何,Stack Overflow答案都应该独立存在。) - Amir
    对于任何想要轻松获取编辑中删除的内容的人,这里是旧页面的链接:https://wiki.postgresql.org/index.php?title=Working_with_Git&oldid=31690#Context_diffs_with_Git - Michael Burr

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接