如何查找所有父提交为给定提交的提交?
例如,如果我有以下Git提交图形,
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
我想获取
B
的所有直接后代列表: D
、E
和F
。如何查找所有父提交为给定提交的提交?
例如,如果我有以下Git提交图形,
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
B
的所有直接后代列表: D
、E
和F
。你可以使用 git rev-list --parents
命令,并使用 grep
和 awk
过滤父节点的子节点。
git rev-list --all --parents | grep "^.\{40\}.*<PARENT_SHA1>.*" | awk '{print $1}'
将代码中的 <PARENT_SHA1>
替换为您的 B
提交的 sha-1 哈希。
编辑
任何时候,当您像这样使用 grep | awk 时,请考虑仅使用 AWK:例如 awk '/<PARENT_SHA1>$/ { print $1 }' 应该可以做到。我甚至会说这就像“无用的 cat 用法”一样是“无用的 grep 用法”。
感谢 shadowtalker。这是一个只使用awk的有效命令行:
git rev-list --all --parents | awk '$0 ~ /^.{40}.*<PARENT_SHA1>.*/ {print $1}'
这对于shell来说稍微简短一些,少了一个步骤。
bash
会在双引号内部特殊处理花括号。 - Daniel Böhmergrep | awk
时,考虑仅使用AWK:例如,awk '/<PARENT_SHA1>$/ { print $1 }'
就可以了。我甚至可以说这是“无用的Grep使用”,就像“无用的Cat使用”一样。 - shadowtalker
D
是B
的子提交,但是E
的兄弟提交。 - Chris Maes