我希望能够在我的 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)的命令,给定 HEAD
和 master
。请注意,一个简单的 git merge-base master HEAD
给了我 F.
最佳答案
这应该可以合理地工作:
git rev-list --topo-order --reverse mine ^master | head -1
使用您的设置副本进行测试,它会打印您标记为“H”的提交。我不是 100% 相信它在所有可能的情况下都能找到“最远”的路径,或者这样的概念甚至是明确定义的,因此您可能希望在依赖它之前对对您重要的情况进行测试。
(请注意,通常会指定用于限制 git rev-list
输出的 -1
选项与 --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
,当commit1
是commit1
的后代时,这是首选语法提交 2
。在这种情况下,mine
和master
发生了分歧,因此更清楚地说明了我们想要什么。也允许多个排除项,例如git log branch1 ^branch2 ^branch3
。这适用于所有采用范围的 git 命令,并记录在git rev-parse
manual 中。 .
关于git: 查找 `mine` 中不存在的最旧提交 `theirs`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516169/