3

我希望能够在我的 git-graph 中找到上游不存在的最长路径。这条路的一端显然是 HEAD,所以这很容易。另一端是我最旧的提交,上游不存在。我不知道如何找到这个。

图表

[otherguy]   H--I--J   
            /       \
[master]   A--B--C--M1--D--E--M2--F--G
              \      \             \
[mine]         H---I--M3---J---K---M4--M--HEAD

我想要一个命令,它会将我指向 H(或 B),给定HEADmaster. 请注意,一个简单的git merge-base master HEAD给我 F。

4

2 回答 2

6

这应该合理地工作:

git rev-list --topo-order --reverse mine ^master | head -1

使用您的设置副本进行测试,它会打印您标记为“H”的提交。我不是 100% 相信它会在所有可能的情况下找到“最远”的路径,或者这样的概念甚至是明确定义的,因此您可能希望在依赖它之前在对您很重要的情况下对其进行测试。

(请注意,-1通常指定限制git rev-list输出的选项不能与 很好地结合--reverse,因此head -1需要。)


更新:

一些解释:

  • git rev-list mine ^master请求可从 访问的提交mine,但不能从master。在您的情况下,我们请求所有以 开头的提交HEAD,不包括那些可以从 到达G的提交,它给出了提交列表(M, M4, K, J, M3, I, H),我们选择最后一个。

  • --topo-order需要确保提交的拓扑顺序(提交始终出现在其父级之前),而不是默认的时间顺序。我们还指定--reverse,因为我们需要最后一个。

  • commit1 ^commit2也可以拼写,当是 的后代commit2..commit1时,这是首选语法。在这种情况下,我们已经分道扬镳了,所以更清楚地说明我们想要什么。也允许多个排除项,例如。这适用于所有采用范围的 git 命令,并记录在手册中。commit1commit2minemastergit log branch1 ^branch2 ^branch3git rev-parse

于 2012-09-20T17:05:29.150 回答
1

这主要等同于问题»哪些提交可以从(我的)HEAD 访问,但不能从 master 访问?« 要回答这个问题,请使用提交范围master..HEAD。您想要此列表中最旧的提交,因此通过 tail: 管道输出git rev-list master..HEAD|tail -n1

如果您的提交时间戳未按时间顺序排列,您可能必须指定--topo-orderrev-list 选项。

于 2012-09-20T17:06:08.420 回答