查找给定提交的所有直接后代

8

如何查找所有父提交为给定提交的提交?

例如,如果我有以下Git提交图形,

   G   H   I   J
    \ /     \ /
     D   E   F
      \  |  / \
       \ | /   |
        \|/    |
         B     C
          \   /
           \ /
            A

我想获取B的所有直接后代列表: DEF

1
你正在寻找“子提交”,而不是兄弟提交... DB 的子提交,但是 E 的兄弟提交。 - Chris Maes
你说得完全正确,英语不是我的母语,我把单词搞混了。这就解释了为什么谷歌无法帮助我回答这个问题 :D - user2294139
1
不用谢。FYI:sibling 意思是“兄弟姐妹”。 - Chris Maes
1个回答

6

你可以使用 git rev-list --parents 命令,并使用 grepawk 过滤父节点的子节点。

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来说稍微简短一些,少了一个步骤。


为什么不在中间部分使用单引号并将反斜杠保留用于转义大括号呢?这样更易读,甚至更加简短,并且在扩展时有一定的“安全性”。 - Daniel Böhmer
@DanielBöhmer https://dev59.com/sF8d5IYBdhLWcg3weiF- - René Link
哦,非常感谢你给我启发!实际上,我本来以为bash会在双引号内部特殊处理花括号。 - Daniel Böhmer
每当你像这样使用管道grep | awk时,考虑仅使用AWK:例如,awk '/<PARENT_SHA1>$/ { print $1 }'就可以了。我甚至可以说这是“无用的Grep使用”,就像“无用的Cat使用”一样。 - shadowtalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接