【问题标题】:Is there a way of having git show lines added, lines changed and lines removed?有没有办法添加 git show 行、更改行和删除行?
【发布时间】:2012-04-13 13:39:25
【问题描述】:

"git diff --stat" 和 "git 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 行不同。

有没有办法获得增量 LOC(在本例中为 26 个)?我并不真正关心区分添加或删除的行。

【问题讨论】:

    标签: git


    【解决方案1】:

    你可以使用:

    git diff --numstat
    

    获取数值差异信息。

    就从添加和删除对中分离修改而言,--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
    

    它有点冗长,所以您可能想在自己的脚本中解析它。

    【讨论】:

    • 感谢 quornian,但 numstat 提供的信息与 stat、添加和删除完全相同。
    • 更新了我的答案以包含--word-diff 的示例用法。这可能更有用。
    • git diff --numstat 的输出按文件细分。要查看差异的总添加/删除,您可以将其通过管道传输到 awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
    • @hughes 获取相同信息的更简单方法是git diff --shortstat。以我的经验,相当于累积git diff --numstat的输出。
    • 也可以通过 FWIW 查看分阶段更改的统计信息,只需添加 --cached
    【解决方案2】:
    1. 如果您想知道提交添加/更改/删除的行 id commit-id,你可以使用

      git show commit-id --stat
      

      git diff commit-id-before commit-id --stat
      
    2. 如果您想知道某个范围内添加/更改/删除的行 提交,你可以使用

      git diff commit-id1 commit-id2 --stat
      
    3. 如果您想知道每次提交添加/更改/删除的行, 你可以使用

      git log --stat
      

    【讨论】:

    • 该解决方案没有回答问题,“git --stat”将单个修改行计为“1 个插入和 1 个删除”。问题询问如何获得“1 改变”。
    【解决方案3】:

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

    git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -Cm
    

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

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

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

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

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

    【讨论】:

    • 这需要更多的支持,因为它实际上显示了修改!谢谢
    【解决方案4】:

    如果您的所有文件都已暂存以供提交,请查看--numstat,如下所示:

    git diff --numstat --cached
    

    示例输出

    32      32      project.pbxproj
    

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

    【讨论】:

      【解决方案5】:

      git 使用“统一”差异作为差异格式,它只有添加和删除的行。您必须执行一些外部操作才能获得显示添加、删除和更改信息的差异。

      https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git 提供了一个脚本的链接,该脚本允许运行常规的旧“diff” - 并且您可以从中生成"context" diff 输出。上下文差异确实显示了添加、删除和更改的行,这应该可以让您获得所需的数据。

      【讨论】:

      • 因链接到文章而不是在此处复制相关信息而投反对票。文章不再包含相关部分。 (诚​​然,它恰好是一个有可用编辑历史的 wiki,但 Stack Overflow 的答案无论如何都应该独立存在。)
      猜你喜欢
      • 2019-08-22
      • 2020-12-23
      • 2019-06-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2023-02-11
      相关资源
      最近更新 更多