为什么在运行“ git branch -r”时显示“ origin / HEAD”?


160

当您运行时,git branch -r为什么会列出它origin/HEAD?例如,在GitHub上有一个远程仓库,有两个分支:master和awesome-feature。如果我git clone要抓住它,然后进入新目录并列出分支,则会看到以下内容:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

或采用什么顺序(阿尔法?我​​伪造此示例是为了保护无辜回购协议的身份保密)。那是什么HEAD业务?它是什么,最后一个人push有他们HEAD在尖时,他们推?难道那永远不是他们push编辑的那样吗?HEAD到处走动...为什么我要关心别人HEAD在另一台机器上指的是什么?

我只是对远程跟踪有所了解,所以这是一个挥之不去的困惑。谢谢!

编辑:我给人的印象是专用的远程存储库(例如GitHub,没有人可以ssh并处理该代码,而只有pull或push等)没有,也不应有HEAD,因为基本上有,没有工作副本。不是吗


Answers:


140

@robinst是正确的。

在git中,您可以选择默认情况下(即克隆时)检出的分支。默认情况下,origin/HEAD将指向该位置。

在GitHub上,您可以在GitHub存储库的管理员设置中更改此设置。您也可以从命令行通过

git remote set-head origin trunk

或通过以下方式将其完全删除

git remote set-head origin -d

实例。查看“开关分支”下拉列表。trunk已检查,因此origin/HEAD如下trunk


我重命名了另一个遥控器origin,这otherremote/HEAD -> master让我很困扰。运行您的命令为我解决了这一问题。
菲利佩·阿尔瓦雷斯

59

裸存储库可以具有HEAD的原因是,因为它确定克隆存储库后最初签出了哪个分支。

通常,HEAD指向master,这是人们克隆存储库时检出的分支。将其设置为另一个分支(通过在裸仓库中编辑HEAD)会导致该分支在克隆上签出。


2
因为可以在不推动的情况下删除该参考,origin/HEAD所以本地参考正确吗?删除对它有没有影响origin
Zach Posten

@zposten:否,就像删除origin/master不会影响遥控器一样。
罗宾斯特

这意味着克隆后的引用只是一条无用的信息。
巴绍(Bachsau)

@Bachsau引用未克隆。
罗宾斯特

27

我给人的印象是专用的远程存储库(例如GitHub,没有人可以ssh并处理该代码,而只有拉或推等)没有,也不应该有HEAD,因为基本上没有任何工作复制。不是吗

我给你的印象完全一样。

而且我什至不能通过执行以下操作删除从github克隆的origin / HEAD远程跟踪分支

git branch -d -r origin/HEAD

这没有效果。

有人可以告诉我如何删除该Origin / HEAD远程跟踪分支吗?

更新

虽然我没有发现为什么从github克隆时为什么创建了origin / HEAD,但是我找到了一种删除它的方法。

新版git提供

git remote set-head <name> -d

删除远程跟踪分支的无用HEAD指针。

我们还可以使用以下方式将哑巴默认名称“ origin”更改为我们想要的名称

git remote rename origin <new_name>

希望这会有所帮助。:)


我遇到了同样的问题(甚至在GitHub上),并且机头无法正常工作。我应该运行'git remote set-head HEAD -d'吗?
Joost Schuur

5
@Joost:是git remote set-head origin -d
2011年

13

您是对的,当它们专用 “裸机”(即没有工作目录)时,推送到专用远程存储库会更好。Git的体系结构旨在通过补丁或pullfetch)进行更新,这在分布式VCS中很有意义。就像文档在某处说的那样,推送到当前已签出的分支可能会导致“意外结果”

HEAD是有效存储库要求的一部分。Git存储库布局部分说:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

因此,即使“这并不意味着太多……”,您也会将HEAD视为分支列表的一部分。


这没有道理。存储库开始时是光秃秃的,但是当您向其中推送内容时,它们不再是光秃秃的,如果您在它们上运行“ git branch”,它们将显示当前已签出的分支。
geoidesic

@geoidesic即使您推送到某个存储库,它也可能是光秃秃的。以下内容:mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "you@example.com"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bare输出true。在这些命令下,foobar存储库中也没有推入文件的工作副本。
安德斯·林登

@geoidesic即使您推送到某个存储库,它也可能是光秃秃的。以下内容:mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "you@example.com"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bare输出true。在这些命令下,foobar存储库中也没有推入文件的工作副本。
安德斯·林登

@geoidesic一个--bare git repo仅仅意味着一个没有工作树的仓库,即一个只包含一个.git目录的仓库,却根本没有任何签出的文件。由于它没有任何签出的文件,因此实际上甚至没有.git目录,它只是将所有.git文件直接放在主目录中。创建一个,您将看到!
–00prometheus

5

如果“ origin”是远程存储库,则origin / HEAD标识该远程存储库上的默认分支。

例:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:walkerh/pipe-o-matic.git
  Push  URL: git@github.com:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

请注意,显示“ HEAD分支:主”的行。远程存储库在这里使客户端知道默认情况下要检出哪个分支。


1

总会有一个HEAD 指向远程仓库中当前已签出的分支(可能是也可能不是主仓库)。甚至远程存储库也有当前分支。通常它是高手,我想不起要更改它的任何原因,但是可以更改。


2
github repos没有签出分支。我不明白为什么会这样。
达斯汀

远程存储库不应具有工作目录。远程存储库应为--bare,因此不能具有当前已签出的分支。
n4rzul 2015年

-14

我的猜测是有人推了一个分支并将其命名为HEAD:

git push origin HEAD

我可以得到一些有关此问题的评论吗?如果您想在github上使用Origin / HEAD,那是我知道的唯一方法。
达斯汀

远程HEAD是一个符号ref(通常是ref / heads / master)。您将用当前分支的提交的哈希ID替换符号ref。
丹尼尔·范朱尔

2
不应在评论中讨论猜测,而不是给出不准确的答案吗?
卢西亚诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.