在处理修复时,一个常见的问题是找出给定修复的版本已应用于哪些版本,即“此修复是否在版本X中”。在git中检查哪个标记版本包含给定的提交id的最好方法是什么?
在复杂的合并模式中手动查看gitk中的提交是非常困难的。
到目前为止,我们能想到的最好的解决方案是使用git-cherry:
git-cherry -v $TAG $COMMIT $COMMIT^
看看它是否与-一起出现。有没有更好的方法?
发布于 2012-01-26 21:21:41
实际上,使用以下命令可以很容易地做到这一点:
git tag --contains f414f31这将列出所有标记,使f414f31成为标记的祖先之一,或者标记本身指向该提交。
这对于查找哪些版本的git包含特定功能特别有用:)
更新:
在下面的评论中回答进一步的问题:
有没有什么简单的方法可以找出所有可能已经应用于独立分支的等价提交?
您可以通过使用git patch-id来查找由提交引入的补丁的散列-这是git cherry、git rebase等使用的命令,用于确定提交是否已经被精心挑选。因此,如果您想要了解分支foo上的提交是否也引入了f414f31引入的更改,您可以始终使用类似于以下内容的简短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如果你想查看所有的分支,你可以用--all替换foo。Jefromi下面的评论建议了一些其他的改进,例如,如果你想停止寻找第一个匹配,你可以添加一个break (如果你只搜索一个分支是明智的),或者通过使用git rev-list foo ^f414f31来排除原始提交的所有祖先。
Jefromi的评论也提醒我,我应该多说一些关于这种方法的内容。documentation for git patch-id解释说,生成的ID是“相当稳定的”-行号和空格可以在不影响ID的情况下更改,但是如果您必须在cherry-pick或rebase过程中修复任何冲突,您可能最终会更改补丁的文本。在这种情况下,这将找不到提交。
我相信你也可以通过调用git cherry来做到这一点,但是我从来都不记得这些参数应该走哪条路……;)
https://stackoverflow.com/questions/9018632
复制相似问题