如何在git提交之前获取最后一个版本

如何在git提交之前获取最后一个版本,git,Git,我正在使用提交id获取最后一个标记。但是,在Linux内核repo中尝试使用git descripe--abbrev=0时,我没有看到预期的结果。例如,当我试图检查c0a333d842ef67ac04adc72ff79dc1ccc3dca4ed之前的最后一个标记时,输出是v5.3-rc1,但似乎v5.4-rc6是正确答案。有没有更好的办法 $ git describe --abbrev=0 c0a333d842ef67ac v5.3-rc1 承诺: v5.4-rc6和v5.4-rc7之间的

我正在使用提交id获取最后一个标记。但是,在Linux内核repo中尝试使用git descripe--abbrev=0时,我没有看到预期的结果。例如,当我试图检查
c0a333d842ef67ac04adc72ff79dc1ccc3dca4ed
之前的最后一个标记时,输出是
v5.3-rc1
,但似乎
v5.4-rc6
是正确答案。有没有更好的办法

$  git describe --abbrev=0 c0a333d842ef67ac
v5.3-rc1
承诺:

v5.4-rc6
v5.4-rc7
之间的差异(参见
文件更改中的
声音/soc/sof/debug.c
):


如果您打算以“包含此特定提交的第一个版本”为目标,您应该查看:

git tag --contains c0a333d842ef67ac
然后选择你看到的最低版本

下面是一个更完整的版本,使用选项仅列出按版本名称排序的版本标记:

# --list "v*" : only tags starting with 'v'
# --sort="v:refname" : sort tags as version numbers (not as plain strings)
# -c versionsort.suffix=-rc : add config option 'versionsort.suffix = -rc'
#      so that release candidates are sorted before final versions

$ git -c versionsort.suffix=-rc tag --list "v*" --sort="v:refname" --contains c0a333d842ef67ac
v5.4-rc7
v5.4-rc8
v5.4
v5.5-rc1
v5.5-rc2
v5.5-rc3
...

git descripe c0a333d842ef67ac
的工作原理与此相反:从提交开始
c0a33…
,在它的一个祖先上看到的最后一个标记是什么

它将为您提供编写修复程序的版本


根据您的评论:

您正在查找不包含该修补程序的最新版本

以下是您如何做到这一点:

  • 查找包含该修补程序的第一个版本(
    v5.4-rc7
    ,如上所述)
  • 以上一个版本为例:在该提交的父级上运行
    git descripe

如果您打算以“包含此特定提交的第一个版本”为目标,则应查看:

git tag --contains c0a333d842ef67ac
然后选择你看到的最低版本

下面是一个更完整的版本,使用选项仅列出按版本名称排序的版本标记:

# --list "v*" : only tags starting with 'v'
# --sort="v:refname" : sort tags as version numbers (not as plain strings)
# -c versionsort.suffix=-rc : add config option 'versionsort.suffix = -rc'
#      so that release candidates are sorted before final versions

$ git -c versionsort.suffix=-rc tag --list "v*" --sort="v:refname" --contains c0a333d842ef67ac
v5.4-rc7
v5.4-rc8
v5.4
v5.5-rc1
v5.5-rc2
v5.5-rc3
...

git descripe c0a333d842ef67ac
的工作原理与此相反:从提交开始
c0a33…
,在它的一个祖先上看到的最后一个标记是什么

它将为您提供编写修复程序的版本


根据您的评论:

您正在查找不包含该修补程序的最新版本

以下是您如何做到这一点:

  • 查找包含该修补程序的第一个版本(
    v5.4-rc7
    ,如上所述)
  • 以上一个版本为例:在该提交的父级上运行
    git descripe

为了得到你没有问过的问题的答案,例如,你如何找到你真正想要的东西。要理解为什么git Descripte使用
v5.3-rc1
而不是
v5.4-rc6
。。。好的,让我们从git descripe
的意图开始,如中描述部分的第一句所总结的:

该命令查找可通过提交访问的最新标记

这有点像维尼理论中的人行话:当应用到有向图时,reachable这个词有一个非常特殊的含义。Git提交图特别是有向无环图或DAG。有关更一般的背景信息,请参阅和。但是,在可达性文章的顶部,我们应该特别关注定义中的这一评论:

如果G是非循环的,则其可达性关系为a;任何偏序都可以这样定义,例如作为其[2]的可达性关系。值得注意的结果是,由于偏序是反对称的,如果s可以达到t,那么我们知道t不能达到s。

(我的粗体强调)。这种偏序和可达性在Git中非常重要,所以最好至少对它们有一个模糊的理解。(一般来说,模糊程度越低越好,但你不一定非得是一个图表专家……呃,这里的理论专家,才能使用这些东西。)

对于可达性讨论,我喜欢使用简化的示例。虽然这些单程列车的交通系统中有任何一个都能正常工作,但这家公司的人还是很喜欢。我在那里生活过好几次

如果你在里士满乘坐红线列车,它会先把你带到北埃尔塞里托,然后是埃尔塞里托广场,然后是北伯克利,依此类推。从里士满到罗克里奇只有一条路可走,而且到不了罗克里奇:你得换车。在红线上根本无法到达Rockridge。当你在麦克阿瑟换车时,你需要乘坐黄线列车,你需要选择去安提俄克的列车,而不是去圣何塞的列车

我们为什么要玩火车? Git的提交与这些火车有一些相似之处。具体来说,Git中的每个提交都向后链接到一些较旧的提交。大多数提交只需返回前一次提交的一跳。这些是单向“火车轨道”。一些提交会向后跳到前面的两个或多个提交,模糊地类似于麦克阿瑟这样的中转站:您可以沿着路径返回到第一个家长,停留在这条列车线上,或者沿着路径返回到第二个家长,切换到其他列车

这些连接构成提交图。因为它是定向的和非循环的,当你乘坐Git火车时,你只能在时间上倒退。我喜欢以类似的方式绘制Git提交图映射,但出于文本目的,我们最终得出以下结论:


F获取你没有问的问题的答案,即,你如何找到你真正想要的东西,请参见。要理解为什么git Descripte使用
v5.3-rc1
而不是
v5.4-rc6
。。。好的,让我们从git descripe
的意图开始,如中描述部分的第一句所总结的:

该命令查找可通过提交访问的最新标记

这有点像维尼理论中的人行话:当应用到有向图时,reachable这个词有一个非常特殊的含义。Git提交图特别是有向无环图或DAG。更一般的背景
$ git rev-list --count --left-right v5.4-rc6...c0a333d842ef67ac04adc72ff79dc1ccc3dca4ed
16962   8