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

sts*_*uad 3 git

处理修复时遇到的一个常见问题是找出已应用修复程序的版本,即"在X版本中是否已修复".git中检查标记版本包含给定提交ID的最佳方法是什么.

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

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

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

看看它是否出现 - .有没有更好的办法?

Mar*_*air 7

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

git tag --contains f414f31
Run Code Online (Sandbox Code Playgroud)

这将列出所有标签,例如f414f31标签的祖先之一,或标签本身指向该提交.

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


更新:

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

有没有简单的方法来找出可能已经应用于单独分支的所有等效提交?

你可以找到提交介绍了使用补丁的哈希git patch-id-就是这样的命令git cherry,git 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
Run Code Online (Sandbox Code Playgroud)

如果要查看所有分支,可以替换foo--all. Jefromi在下面的评论提出了一些其他的改进,例如你可以添加一个break如果你想要停止第一场比赛(如果你只搜索一个分支是合理的),或者通过使用排除原始提交的所有祖先git rev-list foo ^f414f31代替.

Jefromi的评论也提醒我,我应该多说一点这种方法.用于git patch-id解释所生成的ID"相当稳定" 的文档 - 行号和空格可以在不影响ID的情况下进行更改,但是如果您必须在修改过程中修复任何冲突,则最终可能会更改文本补丁.在这种情况下,这将找不到提交.

我确信你也可以通过git cherry不知何故的调用来做到这一点,但我永远不会记得参数的哪个方向意味着......;)