找到给定git提交是否在标记版本中的最佳方法是什么

时间:2012-01-26 13:17:31

标签: git

处理修复程序时的一个常见问题是计算出已经应用了哪些版本的修补程序,即“这是X版本中的此修复程序”。 git中检查标记版本包含给定提交ID的最佳方法是什么。

使用gitk手动调整复杂合并模式中的提交是非常困难的。

到目前为止,我们可以提出的最佳解决方案是使用git-cherry:

git-cherry -v $ TAG $ COMMIT $ COMMIT ^

看看它是否出现 - 。还有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

事实上,使用以下命令这很容易做到:

git tag --contains f414f31

这将列出所有标签,使f414f31是标签的祖先之一,或者标签本身指向该提交。

这对于查找git的哪个版本包含特定功能特别有用:)


更新

在下面的评论中回答进一步的问题:

  

有没有简单的方法可以找出可能已应用于不同分支的所有等效提交?

您可以使用git patch-id找到提交引入的修补程序的哈希值 - 这是git cherrygit rebase等用来查找提交是否已被提交的命令樱桃采摘。因此,如果您想查找f414f31引入的更改是否也由分支foo上的提交引入,您可以使用类似的简短shell脚本:

patch_id () {
    git show $1 | git patch-id | cut -d ' ' -f1
}

P=$(patch_id f414f31)

git rev-list foo | while read C
do
    P2=$(patch_id $C)
    if [ x$P = x$P2 ]
    then
        echo "Also introduced by commit $C"
    fi
done

如果要查看所有分支,可以将foo替换为--allJefromi下面的评论提出了一些其他改进措施,例如:如果您想要停止查看第一个匹配项,则可以添加break(如果您只搜索单个分支,则认为是合理的),或者使用git rev-list foo ^f414f31来排除原始提交的所有祖先。< / p> Jefromi的评论也提醒我,我应该多说一点这种方法。 documentation for git patch-id解释了生成的ID“相当稳定” - 行号和空格可以在不影响ID的情况下进行更改,但是如果你必须在挑选或者rebase期间修复任何冲突,你可能最终会改变补丁的文字。在这种情况下,这将找不到提交。

我确信你也可以通过某种方式调用git cherry来做到这一点,但我永远不会记得参数的哪个方向要去......;)