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

时间:2008-12-09 21:36:29

标签: git version-control github

当您运行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,没有人会在这个代码中进行操作,但只有拉或推等)没有也不应该有一个HEAD,因为有,基本上,没有工作副本。不是吗?

7 个答案:

答案 0 :(得分:127)

@robinst 是正确的。

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

在GitHub上,您在GitHub仓库的管理员设置中为You can change this。您也可以从命令行通过

执行此操作
git remote set-head origin trunk

或通过

完全删除它
git remote set-head origin -d

Example。查看“切换分支”下拉列表。已选中trunk,因此origin/HEAD跟在trunk之后。

答案 1 :(得分:56)

裸存储库可以拥有HEAD的原因是因为它确定在克隆存储库后最初检出哪个分支。

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

答案 2 :(得分:23)

  

我的印象是   专用远程回购(如GitHub   没有人会在这里工作   那个代码,但只有拉或推等)   没有也不应该有一个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>

希望这可以提供帮助。 :)

答案 3 :(得分:13)

你是正确的推送专用远程回购工作,当他们'裸'时,就是当他们没有工作目录时更好。 Git的体系结构旨在通过补丁或pullfetch)进行更新,这在分布式VCS中是有意义的。正如文档在某处说的那样,推送到目前已检出的分支可能会导致“意外结果”

HEAD是有效存储库要求的一部分。 Git Repository Layout部分地说:

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作为分支列表的一部分,即使“它并不意味着......”

答案 4 :(得分:3)

如果“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 branch:master”的行。这是远程存储库允许客户端在默认情况下知道要检出的分支的位置。

答案 5 :(得分:2)

总是有一个HEAD 指向到远程仓库上当前已检出的分支(可能是也可能不是主分支)。甚至远程存储库也有当前的分支。通常它是主人,而且我无法想到为什么人们想要改变它,但它可以改变。

答案 6 :(得分:-9)

我的猜测是有人推了一个分支并称之为HEAD:

git push origin HEAD