Git tag --contains [hash]未显示预期标签x.x.3问题求助
git tag --contains [hash]不包含x.x.3标签? 这种情况最常见的原因是x.x.3标签对应的提交实际上并没有包含你提到的那个[hash]变更——哪怕git log看起来顺序正常,下面是几个具体的场景和验证方法:
场景1:x.x.3标签不是基于包含[hash]的production分支打的
虽然你在5月27日把变更合并到了production,但6月5日打x.x.3标签时,可能是从更早的节点(比如上一个版本x.x.2)拉了独立的release分支做紧急修复,根本没合并production分支上的[hash]提交。等x.x.4发布时,才把production的所有变更(包括[hash])整合进去,所以只有x.x.4及以后的标签包含这个提交。场景2:production分支在打x.x.3标签后被改写过
如果打完x.x.3后,有人对production分支做了rebase、reset这类改写历史的操作,会导致原来包含[hash]的分支历史被替换。而x.x.3标签依然指向原来的旧分支节点,那个节点里并没有[hash]提交——现在你看到的git log是改写后的历史,所以看起来顺序正常,但标签和分支的实际关联已经断了。场景3:标签x.x.3对应的提交是独立于production分支的“孤儿”节点
极端情况下,x.x.3可能是直接在某个临时提交上打的标签,完全没有和production分支的历史关联,自然也不会包含production上的[hash]变更。
快速验证方法
你可以用几个git命令定位问题:
查看x.x.3标签对应的具体提交哈希:
git show --no-patch x.x.3记下这个哈希值,比如
tag3_commit。检查[hash]是否是
tag3_commit的祖先(即标签是否包含该提交):git merge-base --is-ancestor [hash] tag3_commit如果命令返回非0值,就说明[hash]不在x.x.3标签的历史链里,这就是问题核心。
对比x.x.3标签和当前production分支的历史差异:
git log --oneline x.x.3..production如果输出里包含你的[hash]提交,就说明production分支在x.x.3之后才纳入了这个变更,而x.x.3标签没跟上。
内容的提问来源于stack exchange,提问作者Andrej Galuf

