是否有添加git show lines,更改行和删除行的方法?

Jua*_*nso 86 git

"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(-)
Run Code Online (Sandbox Code Playgroud)

但是在那次提交中真正发生的事情是改变了4行,删除了26行,这与添加4行并删除30行不同.

有没有办法获得delta LOCs(在这种情况下为26)?我并不真正关心区分添加或删除的行.

quo*_*ian 103

您可以使用:

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

获得数字差异信息.

至于将修改与添加和删除对分开,--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
Run Code Online (Sandbox Code Playgroud)

这有点啰嗦,所以你可能想要在自己的脚本中解析它.

  • `git diff --numstat`的输出按文件细分.要查看diff的添加/删除总数,可以将其传递给awk:`git diff --numstat | awk'{added + = $ 1; 删除+ = $ 2} END {print"+"添加" - "删除}'` (10认同)
  • @hughes获取相同信息的一种简单方法是`git diff --shortstat`.根据我的经验,它相当于累积`git diff --numstat`的输出. (7认同)
  • 感谢 quornian,但 numstat 提供与 stat、添加和删除完全相同的信息。 (2认同)
  • FWIW 也可以查看阶段性更改的统计信息,只需添加`--cached` (2认同)

小智 51

  1. 如果你想知道由id提交添加/更改/删除的行commit-id,你可以使用

    git show commit-id --stat
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    git diff commit-id-before commit-id --stat
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您想知道范围提交添加/更改/删除的行,您可以使用

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

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

  • 该解决方案没有回答问题,“git --stat”将单个修改行计为“1 次插入和 1 次删除”。问题问如何获得“1 改变”。 (5认同)

Fal*_*son 11

如果您的所有文件都已暂存以进行提交,请查看--numstat如下代码:

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


Flu*_*lux 10

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

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -Cm
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


Dan*_*man 5

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

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

  • 投票否决了链接到一篇文章而不是在此处复制相关信息。文章不再包含相关部分。(诚​​然,它恰好是一个具有可用编辑历史记录的 wiki,但无论如何,Stack Overflow 的答案都应该独立存在。) (3认同)