git log --stat和git show -stat之间的差异?

时间:2018-01-27 22:54:47

标签: git parsing github version-control

我正在研究R package,它应该在粒度级别上解析git存储库历史记录。使用open source project from GitHub验证某些解析结果时,我遇到了意外情况。在我的包的先前验证工作中,我通过git log的输出正确地重建了几个git存储库中每个文件的行数,所以我认为使用git log获取有关已更改文件的综合信息是一个有效的路径跟随。 但是,我在前面提到的project中发现了一个提交,其中git log似乎没有传达有关已更改文件的所有信息:使用哈希184f6c71dee03c66c7adaacb024b70d99075ea75进行提交。将HEAD重置为此提交并同时运行git log --statgit show --log时,我明白这一点:

$ git log --stat
commit 184f6c71dee03c66c7adaacb024b70d99075ea75
Merge: 32e47a3 d203300
Author: ***
Date:   Wed Nov 12 10:39:51 2014 +0100

    merge changes from master branch

commit d203300bbe45981dab15b49c3c08deb31ad46466
Merge: 4b63f4e c8ae895
Author: ***
Date:   Wed Nov 12 10:35:36 2014 +0100

[ output truncated ]

commit 32e47a32f3cc60b5705e9df93cdc6b730fae380b
Author: ***
Date:   Tue Nov 11 18:00:55 2014 +0100

    Added the internal class template `MatrixColumnVisitor` to represent
      `VectorVisitor` concept for a column that is a `matrix`. Part of #602

 NEWS.md                                  |   3 +++
 inst/include/dplyr.h                     |   1 +
 inst/include/dplyr/MatrixColumnVisitor.h | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 inst/include/dplyr/VectorVisitorImpl.h   |   4 +++-
 inst/include/dplyr/visitor.h             |  17 ++++++++++++++---
 inst/include/dplyr/white_list.h          |   4 ++++
 tests/testthat/test-filter.r             |  12 ++++++++++++
 7 files changed, 204 insertions(+), 4 deletions(-)

[ output truncated ]

$ git show --stat
commit 184f6c71dee03c66c7adaacb024b70d99075ea75
Merge: 32e47a3 d203300
Author: ***
Date:   Wed Nov 12 10:39:51 2014 +0100

    merge changes from master branch

 NEWS.md                                        |  4 ++--
 R/RcppExports.R                                |  4 ++++
 R/src-sql.r                                    |  2 +-
 inst/include/dplyr/NamedListAccumulator.h      | 12 ++++++------
 inst/include/dplyr/Result/LazyGroupedSubsets.h |  4 ++--
 inst/include/dplyr/Result/LazySubsets.h        |  4 ++--
 inst/include/dplyr/Result/Name.h               | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 inst/include/dplyr/Result/all.h                |  1 +
 src/RcppExports.cpp                            | 15 +++++++++++++++
 src/dplyr.cpp                                  | 29 ++++++++---------------------
 src/strings_addresses.cpp                      | 19 +++++++++++++++++++
 tests/testthat/test-joins.r                    |  7 +++++++
 tests/testthat/test-mutate.r                   | 18 ++++++++++++++++++
 13 files changed, 131 insertions(+), 34 deletions(-)

这是令人惊讶的,因为我想

git log --stat

并且

git show --stat

给我相同的信息。 情况并非如此,因为从git log输出,我得出的结论是,在感兴趣的提交中没有更改文件。

查看提交on GitHub或在RStudio git选项卡中,我可以看到此提交不为空,即显示git show的信息似乎是正确的,在我看来有信息该提交的git log缺少。

知道为什么会出现这种差异?正如所指出的,对于大量的提交,我可以从git log正确地重现git存储库中每个文件的行数,但不适用于此。我在macOS上运行git 2.9.2。提前谢谢。

1 个答案:

答案 0 :(得分:1)

默认情况下,git log 跳过显示合并提交的差异,而git show显示合并提交的组合差异。将--cc(显示组合差异)添加到git log选项会告诉git log显示合并的差异(或统计数据)。

请注意,组合差异的用途有限。要进行正确分析,您可能需要-m,这是git loggit show都接受的选项。它告诉命令实际上将每个合并拆分为多个虚拟提交。合并提交具有 n 父项,其中n≥2-m使Git转为提交A与父母P1,P2,...,Pn 进入使用父P1提交A-P1;用父P2提交A-P2; ...;使用父Pn 提交A-Pn,然后单独显示(或--stat)每个提交。