当前分支处于分离状态

Posted

技术标签:

【中文标题】当前分支处于分离状态【英文标题】:Current branch in a detached state 【发布时间】:2022-01-19 14:43:07 【问题描述】:

有几种可能的方法来获取当前分支的名称:

current-branch1 = name-rev --name-only HEAD
current-branch2 = branch --show-current

#1 在存在标签的情况下无法正常工作...

#2 确实工作得更好......除非 HEAD 指向分离状态。

是否有更好的别名来了解提交是在分离状态下在哪个分支上完成的?换句话说,一个在所有情况下都能更好地工作的别名?

更新 -- 在签出提交时,我想获取提交所在的分支的名称...

$ g co 2767c5f9
Note: switching to '2767c5f9'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in 
this state without impacting any branches by switching back to a branch.
[...]
HEAD is now at 2767c5f9 Update ChangeLog

$ git for-each-ref --format="%(refname:short)" --points-at HEAD refs/heads

最后一个命令什么都不返回...

【问题讨论】:

“分离的 HEAD”状态意味着,从字面上看,你不在任何分支上。 “在一个分支上”意味着HEAD 附加到一个分支名称。当HEAD 未附加到分支名称时,没有分支名称。你不能得到不存在的东西。 Git 不存储提交的分支名称,因为 Git 不认为分支名称重要或相关。甚至不要试图问这个,Git 说。它没有用:如果它有任何值,则该值是负数,而不是正数(即,知道您当时在哪个分支上会让事情更糟糕)。 @torek,感谢您的解释。我不明白为什么在我提交时知道我在哪个分支上既没有预见也没有好处,但这澄清了答案! 花了一些时间,但我最终同意 Linus Torvalds 的观点,即分支名称具有负值,而不是正值……除非分支名称编码了语义.在这种情况下,您可能需要一个 prepare-commit-msg 挂钩,将分支名称复制到准备好的提交消息中。但总的来说,您希望提交有意义的东西,而“这是在哪个分支上”不是。 【参考方案1】:

是的,有:

# any ref (branch or tag or remote branch or ...)
git for-each-ref --format="%(refname:short)" --points-at HEAD

# branches only :
git for-each-ref --format="%(refname:short)" --points-at HEAD refs/heads

警告:如果多个 refs/branch 指向当前提交,上述命令会将它们全部列出。


[edit] git name-rev 也有一个--refs option,你只需要知道分支是以refs/heads 开头的引用:

git name-rev --name-only --refs="refs/heads/*" HEAD

【讨论】:

嗨@LeGEC。你的命令并不比 current-branch2 好。他们还是更好吗? 来自您的问题:我认为您的意思是“命名当前指向我当前提交的任何分支”。否则:尝试git branch --containsgit for-each-ref --contains 关于git for-each-ref --format="%(refname:short)" --points-at HEAD refs/heads 或我的别名#2 是否更好?

以上是关于当前分支处于分离状态的主要内容,如果未能解决你的问题,请参考以下文章

git命令行

git 处于游离的状态的解决办法

如何确定当前视图控制器是不是处于活动状态,如果处于活动状态则执行代码

sql server分离及附加数据库

Android中判断当前处于哪个Activity

用状态机表示SFC中的并行分支