繁体   English   中英

Git 显示距离给定提交的距离为 n 的所有可到达的提交

[英]Git show all reachable commits at distance n from a given commit

是否有命令显示以给定提交为中心的深度为n的提交子树?

换句话说,给定以下提交树

A +-> B +-> C +-> D
|     |
|     +-> E +-> F
|
+-> G
  • git ??? --depth 1 C git ??? --depth 1 C应该返回B, C, D
  • git ??? --depth 2 C git ??? --depth 2 C应该返回A, B, C, D, E

理想情况下,输出应格式化为git log --oneline --graph的输出。

您必须为此编写自己的程序。

这对计算很重要,因为 Git 的提交链接只会向后移动 您已经绘制了向前链接在一起的提交(实际上也有相同的困难,但解决问题需要知道箭头的方向)。 也就是说,实际的链接集是这样的:

G-> A
F-> E
E-> B
D-> C
C-> B
B-> A

如果您的图中有任何合并提交,则合并提交将有多个弧。 例如,给定:

...--J
      \
       M   <-- somebranch
      /
...--L

合并提交M有两个输出弧,将其连接到提交JL (按此顺序)。

您将需要运行git rev-list --parents ,为其提供开始(结束?)点提交,您希望从该点开始让 Git 向后工作。 这将发出每个可访问提交的哈希 ID,从这些起点开始,并包括同一行上每个提交的父哈希 ID。 如果要使用所有引用作为起点,请使用git rev-list --all 如果要使用所有分支名称,但不使用标签名称作为起点,请使用git rev-list --branches 如果您想要所有标签名称但没有分支名称,请使用git rev-list --tags 等等。 有关更多详细信息,请参阅git rev-list文档

(你可能想知道哪些提交是起点提交。如果是这样,你需要一些额外的工作,比如使用git for-each-ref来梳理引用。完成后,你可以给git rev-list原始哈希 ID,而不是使用--branches--tags--all或其他任何东西。)

请注意,分支合并可能会为您提供如下图:

       H-----I
      /       \
...--G         M--N--...
      \       /
       J--K--L

这样提交G既是从M后退三步(沿顶部),又是从M后退四步(沿底部)。 因此,它从N后退 4 步和 5 步,依此类推。 您想如何处理这取决于您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM