我正在使用git tag -l --merged
查看适用于我当前分支的标记。这适用于所有地方。
今天在其中一个存储库(由Jenkins git插件创建)中,该命令不返回任何内容。
导致这种情况的原因是什么?
答案 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 branch
或git reset
移动分支名称"向后" 。您将需要修复它,这可能比修复分离的HEAD更复杂。 可能就像git reset
一样简单地将分支名称放回适当的提交,但它可能不会。
如果你只是在错误的分支上,你只需再次git checkout
正确的分支,这样你就可以回到你想要的分支上。
因此,此时要做的第一件事就是检查git status
。你的HEAD分离了吗?如果是,请解决 。如果没有,你是否在正确的分支?如果没有,请解决 。否则,弄清楚你做了什么来改变分支名称的值,并解决它。