为什么我的 `git branch -l -a` 命令输出中会有一个 `remotes/origin/HEAD -> origin/master` 条目?

79

我不理解git branch -l -a命令的输出中第二行的含义:remotes/origin/HEAD -> origin/master

git branch -l -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

这是其他操作留下的吗?我该清理它吗?如果需要,我该怎么做?

通常我在命令行上使用 git,但在这个本地仓库中,我尝试了 TortoiseGit 来为朋友找到一个简单的 git 工作流。


1
可能是为什么运行“git branch -r”时会显示“origin/HEAD”?的重复问题。 - Colin D Bennett
1
顺便说一下,-l 可能不会做你想要的事情。通常,它会创建 reflog,但在这里可能被省略了。如果要列出所有分支,git branch -a 就足够了。 - Palec
@ColinDBennett 不。 - JobHunter69
2个回答

50

2
感谢您提供简明扼要的答案和链接。我想我之所以感到困惑,是因为我将这个测试仓库与另一个没有远程/origin/HEAD引用的仓库进行了比较。 那个仓库是我推送到GitHub的原始仓库,因此从未被克隆过。这个(没有被克隆)是它不包含HEAD引用的原因吗? - mistaecko
5
如果你想要移除它:可以使用 git remote set-head origin -d 命令,参考 https://dev59.com/4nRC5IYBdhLWcg3wROzk#6838756。 - G-Wiz
@VonC 好的,所以第二行告诉你指向分支的指针和分支是什么,对吧?第三行列出了该分支。 - JobHunter69
@Goldname 是的,指针(位于“remotes”命名空间中)和分支(位于“remotes”命名空间中):它们是从名为 origin 的远程仓库中最后获取的副本。 - VonC
1
@Goldname 因为分支是指向最新提交的指针,本身引用了过去提交的历史记录。每当您获取时,都会获取所有新提交,并将remotes/origin/master更新为这些新提交中最新的提交。要了解有关分支的更多信息:https://stackoverflow.com/a/51224861/6309,有关获取的信息:https://dev59.com/t4fca4cB1Zd3GeqPkZDJ#28341622,https://dev59.com/Pn_aa4cB1Zd3GeqP3ng4#23530333。 - VonC
显示剩余3条评论

41
你可以使用git remote set-head origin -d命令删除origin/HEAD符号引用,或者使用git remote set-head origin -a命令查询远程并自动设置origin/HEAD指针到远程的当前分支。 origin/HEAD参考是可选的。它只是作为一种语法快捷方式:如果它存在并指向origin/master,那么你可以在你原本需要指定origin/master的地方使用简单的origingit remote(1)手册描述了这个命令:

set-head

设置或删除指定远程的默认分支(即符号引用refs/remotes//HEAD的目标)。不要求对于一个远程有默认分支,但允许在不指定特定分支的情况下指定远程的名称。例如,如果将origin的默认分支设置为master,则可以在通常需要指定origin/master的任何地方使用origin。


是否可以调用 git branch -l -a 或类似命令,并过滤掉 HEAD 和其他符号引用? - David Portabella
您可以使用 git branch --list -a | grep -v ' -> ' - Colin D Bennett
当然可以,但这种方法非常不可靠。如何知道所有的“异常”... - David Portabella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接