问题描述
大多数提交都有 1 个父提交。但是,一些提交有多个父级。例如,在 --no-ff
(无快进)标志下创建的合并提交至少有 2 个父项。
git 中是否有一个命令可以显示特定提交具有的确切父级数量?
解决方法
查看父提交列表:
git show -s --format=%p [commit-id]
只显示父母的数量:
git show -s --format=%p [commit-id] | wc -w
说明:
-
-s
是--no-patch
的缩写,即 suppresses the diff output。 -
%p
displays only the parents 格式。 -
wc
在 *nix shell 中是 word count,而-w
只是单词。
对于随意或人类可读的答案,请使用 git show
作为 TTT's post。
然而,尽管 --format
使用干净,git show
的输出允许改变:它是 git
的“管道/瓷器分离”中的 "porcelain command" ”。 (The same is true of git log --format
.) 更改可能不太可能发生,但您也可能会看到错误和其他人为导向的输出,因为 git show
旨在供人类使用而不是脚本使用。
对于更严格或规范保证的父级列表,适用于长期存在的 shell 脚本或工具集成,您需要使用类似 git cat-file
的 plumbing command,类似于 {{3 }}。
git cat-file -p [commit-id] | sed -ne '/^$/q;/^parent/p' | wc -l
-
git cat-file -p
将漂亮地打印具有给定 ID 的对象。HEAD
之类的修订也适用于此。 -
sed
此处将过滤并截断输出:-
-n
禁止所有输出。 -
-e
使用在命令行中指定的脚本。 -
/^$/q
告诉sed
在看到空行时退出,就像将提交元数据与其消息分开的行一样。这可以防止在提交正文中误解“父”这个词。 -
;
分隔sed
命令。 -
/^parent/p
告诉sed
只打印以parent
开头的行,覆盖-n
。
-
-
wc -l
打印结果行数。
再说一次,在大多数情况下,git show
是一种更惯用的方法,因为它在一个命令中读取和解析所有提交,并且已经在编写时考虑了边缘情况和奇怪的情况。但是,对于长期存在的 git
工具的开发者来说,管道命令可能是更有保证的解决方案。