是否有办法添加 Git 显示行、更改行和删除行?

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行不同。

有没有办法获得 delta LOC (本例中为26) ?我并不关心添加或删除的行之间的区别。

123158 次浏览

你可使用:

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

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

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

Https://wiki.postgresql.org/wiki/working_with_git#context_diffs_with_git 给出了一个脚本的链接,这个脚本允许运行常规的旧“ diff”——从这个脚本可以生成一个 “上下文”不同输出。上下文 diff 确实显示了添加、删除和更改的行,这应该允许您获得所需的数据。

  1. 如果您想知道通过提交使用 你可以使用

    git show commit-id --stat
    

    或者

    git diff commit-id-before commit-id --stat
    
  2. If you wat to know the lines added/changed/deleted by a range commits, you could use

    git diff commit-id1 commit-id2 --stat
    
  3. If you want to know the lines added/changed/deleted by each commit, you could use

    git log --stat
    

如果你所有的文件都是为了提交而设置的,那么看看 --numstat是如何运行的:

git diff --numstat --cached

示例输出

32      32      project.pbxproj

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

您可以使用 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有一个缺失的功能: diffstat不能显示文件移动/重命名(例如 app/{a.rb => b.rb}) ,而 git diff --stat能够通过使用 -M(--find-renames)选项或在 git 配置文件中设置 diff.renames来显示这些信息(参见 man git-config)。