合并提交只是一个恰好具有多个父级的提交。
在你提到的情况下, a4632dad6cf5 是一个合并提交。它的第一个父母是 5b0ab1143b25 ,它的第二个父母是 4f3017c71849 :
a4632dad6cf5
5b0ab1143b25
4f3017c71849
$ git log -1 --format=fuller a4632dad6cf5 commit a4632dad6cf5ecdbcd8e4f357c69f3b34afc04f0 (HEAD) Merge: 5b0ab114 4f3017c7 Author: [...] AuthorDate: Thu Jan 25 14:01:50 2018 +0800 Commit: [...] CommitDate: Thu Jan 25 14:01:50 2018 +0800 Merge branch '2.5.x' [...]
如果这是一个常规提交,它就不会有第二个父提交 4f3017c71849 。
比较此合并之前和之后的状态 的 从分支的角度来看,合并发生了 强> ,差异第一个父母 5b0ab1143b25 反对合并 a4632dad6cf5 :
$ git diff --shortstat 5b0ab1143b25..a4632dad6cf5 -- '*.java' 65 files changed, 976 insertions(+), 323 deletions(-)
比较这个:
$ git checkout 5b0ab1143b25 2>/dev/null $ git ls-files -- "*.java" | xargs cat | wc -l 155131 $ git checkout a4632dad6cf5 2>/dev/null $ git ls-files -- "*.java" | xargs cat | wc -l 155784
两者之间的文件数量差异是 653 :
653
155784 - 155131 = 653
两者之间的加法和删除的总和 5b0ab1143b25 和 a4632dad6cf5 也是 653 :
976 - 323 = 653
这是一种在没有checkout的情况下计算行数的方法(它可以在裸存储库中工作),但是可能更快地检查每个提交。这有点天真的假设,即一切都以此结束 .java 是一个 blob 宾语:
.java
blob
$ git ls-tree -r 5b0ab1143b25 | grep '\.java$' | awk -F' ' '{print $3}' | xargs -n1 git cat-file blob | wc -l 155131 $ git ls-tree -r a4632dad6cf5 | grep '\.java$' | awk -F' ' '{print $3}' | xargs -n1 git cat-file blob | wc -l 155784