git tag -l --merged不显示任何标签

时间:2017-02-13 13:43:39

标签: git tags

我正在使用git tag -l --merged查看适用于我当前分支的标记。这适用于所有地方。

今天在其中一个存储库(由Jenkins git插件创建)中,该命令不返回任何内容。

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

git status

开始

命令git tag --merged表示git tag --merged HEAD。也就是说,--merged需要特定的提交ID ,默认为HEAD。 (-l选项隐含--list--merged;您可以根据需要使用它。或者不使用它。)

然后找到(并列出)满足条件的标签"是一个祖先"指定的提交。或者,等效地,我们可以说这列出了HEAD是标记提交的后代的标记。

假设代码未以任何方式更改,如果HEAD曾被列为一个或多个代码的后代,并且HEAD不再列为这些标签的后代,只有一个可能的结论:HEAD本身已经以某种方式发生了变化。标签改变是不正常的:这是标签的一种点,是特定提交的不变名称。因此,假设标签没有改变,通常可以非常安全。

另一方面,HEAD改变是很正常的。 HEAD 总是指的是当前的提交,通过历史记录(检查或测试以前的提交)并创建新的历史记录(即,创建新的历史记录)是很正常的提交)。所以问题现在变成:HEAD的当前值是什么?

可以通过两种不同的方式修改此值。

  • 你可以拥有一个所谓的"分离的HEAD"。这里,HEAD包含提交哈希。 HEAD的值就是HEAD中的任何内容。使用git checkout和其他一些提交哈希来检查其他一些提交,即移动这个分离的HEAD(但也请参见Fix a Git detached head?)。这是通过历史记录的正常方式。

    还有其他方法可以移动分离的HEAD,例如,使用git bisect来查明引入错误的提交。如果您处于二等分操作的中间,您也将处于分离的HEAD状态。 (在这种情况下,完成或终止bisect操作。)或者,如果您处于由于您的指示暂停的git rebase中间(例如,在交互式rebase中使用edit)或合并冲突,恢复或终止rebase。

  • 或者,当HEAD不在此"分离的HEAD" state,它包含一个分支名称。 HEAD的值则是相应分支名称的值 - 但可以修改分支名称本身。

要检查HEAD是否引用分支名称或是否已分离,您可以使用git status

$ git status
On branch master
...

或:

$ git status
HEAD detached at 8f60064

或类似的。 "在分支上......"意味着"没有分离"。如果你正处于一个二元或一元的中间,现代的Git git status也会告诉你。完成将带您回到以前的任何模式,可能"在分支分支"。

如果你处于分离的HEAD模式 - 除了作为操作的一部分你需要完成 - 并希望退出它,你可以用git checkout检查任何分支名称:

$ git checkout master
Switched to branch 'master'
...

(但请注意,您在处于此分离的HEAD状态时所做的任何提交现在都没有名称 - 请参阅Fix a Git detached head?)。

如果 在分支上,这意味着您现在所在分支的提示不是任何标记的后代。

如果(但现在不是),则必须使用git branchgit reset移动分支名称"向后" 。您将需要修复它,这可能比修复分离的HEAD更复杂。 可能就像git reset一样简单地将分支名称放回适当的提交,但它可能不会。

如果你只是在错误的分支上,你只需再次git checkout正确的分支,这样你就可以回到你想要的分支上。

因此,此时要做的第一件事就是检查git status。你的HEAD分离了吗?如果是,请解决 。如果没有,你是否在正确的分支?如果没有,请解决 。否则,弄清楚你做了什么来改变分支名称的值,并解决它。