177

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

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

或者它的顺序是什么(alpha?我假装这个例子来保持无辜回购的身份秘密)。那么有什么HEAD业务呢?push他们HEAD推的时候是最后一个被指的人吗?这不总是他们push编的吗?HEAD走来走去……我为什么要在乎别人HEAD在另一台机器上指着什么?

我只是在处理远程跟踪等问题,所以这是一个挥之不去的困惑。谢谢!

编辑:我的印象是专用远程存储库(例如 GitHub,没有人会 ssh 进入并处理该代码,但只能拉或推等)没有也不应该有 HEAD,因为基本上,没有工作副本。不是这样吗?

4

7 回答 7

156

@robinst是正确的。

在 git 中,您可以选择默认签出哪个分支(即当您克隆时)。默认情况下,origin/HEAD将指向那个。

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

git remote set-head origin trunk

或通过完全删除它

git remote set-head origin -d

例子。查看“切换分支”下拉菜单。trunk被检查,所以origin/HEAD如下trunk

于 2011-07-27T02:14:35.170 回答
64

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

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

于 2010-05-21T15:08:06.400 回答
29

我的印象是专用的远程存储库(例如 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>

希望这能有所帮助。:)

于 2009-07-30T10:14:46.923 回答
13

你说得对,当它们“裸露”时,即当它们没有工作目录时,推送到专用远程存储库会更好。Git 的架构设计用于通过补丁或pull( fetch) 进行更新,这在分布式 VCS 中是有意义的。正如文档在某处所说,推送到当前已签出的分支可能会导致"unexpected results"

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 作为分支列表的一部分,即使“它没有多大意义......”

于 2008-12-10T18:27:42.277 回答
6

如果“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 分支:master”的行。这是远程存储库让客户端知道默认签出哪个分支的地方。

于 2012-05-07T22:53:41.707 回答
1

总是有一个 HEAD指向远程 repo 上当前签出的分支(可能是也可能不是 master)。即使是远程存储库也有当前的分支。通常它是主人,我想不出有什么理由要改变它,但它是可以改变的。

于 2008-12-10T00:43:42.610 回答
-14

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

git push origin HEAD
于 2008-12-09T23:30:34.677 回答