如何在git中提交之前找到最近的标记

时间:2017-01-18 18:16:02

标签: git

我试图在特定分支中提交后找到最近的标记。

我知道git describe会走回去找一个带有标签的最近的祖先,但我该怎么朝相反的方向移动。

例如:

Commit History

鉴于提交2,我想返回将来的标签。 git describe将返回过去的标记。

3 个答案:

答案 0 :(得分:7)

git describe --contains <commit 2> | cut -d'~' -f1怎么样?因为这将通过提交数量从标记返回<commit 2>,只需将~之前的部分作为标记名称(假设您的标记名称不包含~)。

答案 1 :(得分:1)

git tag --contains <commit 2> | xargs -I {} sh -c 'echo "$(git rev-list --count <commit 2>..{}) {}"' | sort -n | head -n 1 | cut -d ' ' -f 2-

这里最近的是由提交量决定的。如果有多个具有相同距离,则无法保证您将获得哪一个。如果您希望所有人都具有相同的最小距离,请从管道中删除head来电。

注意:在合并的情况下,这可能无法最佳地工作,如果您在有问题的提交之后已经分支并合并这些分支并且在该合并之后具有标记,则两个分支的提交将有助于提交量以及距离。

答案 2 :(得分:1)

提交'箭头朝另一个方向走。提交1不指向提交2;相反,提交2分提交1.这很重要,因为......

在你的图表中,你只绘制了四个提交,既没有分支也没有合并。也就是说,您已经绘制了以下内容:

A <- B <- C <- D   <-- branch-tip

(我已经从数字切换到字母,因为有26个字母,只有10个一位数字,而不是我正在使用十个一位数的数字....)如果你在提交{ {1}},很容易回到提交B:这是箭头指向的方向。事实上,如果没有协助,就很难做到 - 走另一条路。

我们需要的帮助的关键点是以后提交的身份或定位器。例如,使用名称A,我们可以找到提交branch-tip。从D开始,我们可以返回D,然后返回C,现在我们已经找到了可用的路径。

但这张图太简单了。让我们画一个带有分支的。因为我们知道Git的箭头都是向后的,所以我们不要费心绘制内部箭头,只使用连接线,知道当我们像这样水平绘制时,我们只能向左移动。而且,让我们加入你的标签,还有更多:

B

现在,您希望在提交tag:past | | tag:future | | tag:distantfuture v v v A--B--C---D <-- branch1 \ E--F <-- branch2 ^ ^ | | | tag:future3 | tag:future2 Bfuture时找到哪个未来的代码?我们知道您既不需要future2也不需要future3,但distantfuturefuture2距离future只有一步之遥。

关键是他们在某个方向上一步:朝向B的尖端或branch1的尖端。您可能希望选择一个方向,并且这样做的方式与您首先帮助Git找到提交branch2D的方式相同,方法是选择一个定位最终返回的提交的标识符。 F

如果您确实想要控制方向,则需要使用B来查找git rev-list --ancestry-path 后代祖先的提交给定的分支尖端(不包括B本身,包括分支尖端)。

然后,将此提交列表与Vampire's answer之类的内容组合在一起,以便您只查看指向此祖先路径上的提交的标记。也就是说,抛弃“包含提交B的标记”列表中任何指向B输出中的提交的标记。

请注意,这不会解决在包含合并和分支的图形情况下出现的问题:

git rev-list

此处,如果有标记指向提交 C--D / \ A--B G--H <-- branch-tip \ / E--F D,则两者都与F等距,但两者都位于从BB的前方路径上H

请注意,Vampire's answer只是使用所有标记作为查找可能返回B的后续提交的方式,使用--contains将列表限制为的标签最终会返回Brev-list --count方法然后找到它们的“距离”。但如果图中有合并,则此计数可能有些缺陷。例如,在最后一个图表中,使用提交环,从HB的“距离”实际上是;但是从H返回B的路径中有六次提交。它只是其中两个 - C-DE-F - 可以并行遍历。

(注意:如果 使用--ancestry-path将测试限制为指向某个特定图形路径中的提交的标记,那么git rev-list --count指标中的轻微缺陷就会赢得没关系,因为同样的计数缺陷将适用于所有歧义。如果你使用--ancestry-path,这只是一个问题:在这种情况下,包含合并提交的标签可能会产生比不包含合并提交的标记高得多,但实际上“更接近”提交B。)