【问题标题】:Git: how to find shortest path between commitsGit:如何找到提交之间的最短路径
【发布时间】:2018-11-29 18:13:27
【问题描述】:

给定一个包含数百个分支/数千个提交的大型 git 存储库,以及不规则的分支合并策略,如何确定两个提交之间的最短路径?换句话说,从较早的提交 A 到后来的提交 B 的哪个分支路径跨越的提交次数最少?

(在我的例子中,我试图追踪一个“开发”分支的历史,该分支通过快进无意中被合并到特性分支中。“最短路径”策略似乎是一种实用的方法,但我已经一直在查看 git-log 和 git-rev-list [v1.8.3.1] 的帮助页面,但没有找到任何似乎可以做到这一点的选项。我是否遗漏了一些明显的东西?)

【问题讨论】:

  • “最短路径”是什么意思?

标签: git git-log git-rev-list


【解决方案1】:

我不确定你在问什么,但要找到 A 如何到达 B,你可以使用这个:

git log commitA..commitB

您可以使用--graph--simplify-merges 标志使其更清晰。

你也可以像这样美化日志:

git log --simplify-merges --graph --pretty="tformat:%C(yellow)%h%Creset\\ %Cgreen(%ar)%Creset\\ %C(blue)<%an>%Creset\\ %C(red)%d%Creset\\ %s"

然后得到这样的输出:

【讨论】:

  • 但这是“从早期提交 A 到后来提交 B [哪个] 跨越 least number of commits 的分支路径吗?”见History simplification
  • 感谢您的图片!使解释这一点变得容易得多。假设我想要从 63556da 到 0791d5c 的最短路径。有两条路径,一条有两个提交,一个有三个。我想查看 db7f4c8 和 1affc3f 并排除其余部分。
  • @Lagrangian 这是到 0791d5c 的最短路径,如果没有合并的提交,您将无法到达那里。没有合并的提交就没有 0791d5c。只有 db7f4c8。
  • 您可以使用--no-merges 标志不显示合并。
  • 您可能想要添加 --ancestry-path,它会丢弃不是下限 (commitA) 后代的提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多