有没有办法让git show添加行,更改行并删除行?


109

“ 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)?我真的不关心区分添加或删除的行。

Answers:


125

您可以使用:

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

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


2
感谢quornian,但是numstat提供的信息与stat,添加和删除完全相同。
Juan Alonso 2012年

更新了我的答案,以包括的示例用法--word-diff。那可能更有用。
quornian '04

13
的输出git diff --numstat按文件细分。要查看差异的总添加/删除量,您可以将其通过管道发送到awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
拥抱

15
@hughes一种获取相同信息的简单方法是git diff --shortstat。以我的经验,这相当于累加的输出git diff --numstat
klaus triendl '18

1
同样,FWIW要查看分阶段更改的统计信息,只需添加--cached
xlm,

65
  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更改”。
Juan Alonso

6

如果所有文件都已准备好提交,请按照--numstat以下步骤进行:

git diff --numstat HEAD~

4

git使用“统一”差异(仅添加和删除了行)作为差异格式。您必须在外部做一些事情才能获得显示添加,删除和更改信息的差异。

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


3

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

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

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

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

修改的行数的计数是近似值,如下所示man diffstat

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

git diff --stat和之间的主要区别是diffstatdiffstat不显示文件移动/重命名(例如app/{a.rb => b.rb})。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.