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

Posted

技术标签:

【中文标题】为啥运行“git branch -r”时显示“origin/HEAD”?【英文标题】:Why is "origin/HEAD" shown when running "git branch -r"?为什么运行“git branch -r”时显示“origin/HEAD”? 【发布时间】:2010-09-26 03:23:19 【问题描述】:

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

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

或者它的任何顺序(alpha?我伪造这个例子来保持无辜回购的身份秘密)。那么HEAD 业务是什么?这是push 的最后一个人在他们推动时让他们的HEAD 指向的吗?那不总是他们pushed 的样子吗? HEADs 到处走动……我为什么要在意别人的 HEAD 指向另一台机器?

我刚刚掌握了远程跟踪等,所以这是一个挥之不去的困惑。谢谢!

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

【问题讨论】:

相关:***.com/questions/8839958/… 【参考方案1】:

@robinst 是正确的。

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

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

git remote set-head origin trunk

或通过

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

Example。查看“切换分支”下拉菜单。 trunk 被选中,所以 origin/HEAD 跟在 trunk 后面。

【讨论】:

我将另一个遥控器重命名为origin,而我的otherremote/HEAD -> master 困扰着我。运行你的命令为我解决了这个问题。【参考方案2】:

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

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

【讨论】:

因为可以在不推送的情况下删除此引用,origin/HEAD 是本地引用正确吗?删除它对origin 有影响吗? @zposten:不,就像删除origin/master不会影响遥控器一样。 这意味着在克隆后引用只是一条无用的信息。 @Bachsau 引用没有被克隆。【参考方案3】:

我的印象是 专用远程仓库(如 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 上),并且 set-head 不起作用。我应该运行“git remote set-head HEAD -d”吗? @Joost:是git remote set-head origin -d【参考方案4】:

你说得对,推送到专用远程存储库在“裸露”时工作得更好,也就是说,当它们没有工作目录时。 Git 的架构设计用于通过补丁或pull (fetch) 进行更新,这在分布式 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 作为分支列表的一部分,即使“它没有多大意义......”

【讨论】:

这没有意义。存储库一开始是裸露的,但是当您向它们推送某些内容时,它们就不再是裸露的,如果您在它们上运行“git branch”,它们将显示当前已签出的分支。 @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 A --bare git repo 仅表示没有工作树的存储库,即仅包含 .git 目录但根本没有任何签出文件的存储库。由于它不能有任何签出文件,它实际上甚至没有 .git 目录,它只是将所有 .git 文件直接放在主目录中。创建一个,你会看到!【参考方案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 分支:master”这一行。这是远程存储库让客户端知道默认签出哪个分支的地方。

【讨论】:

【参考方案6】:

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

【讨论】:

github repos 没有签出分支。我不明白为什么这会适用。 远程存储库不应有工作目录。远程存储库应该是 --bare,因此不能有当前签出的分支。【参考方案7】:

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

git push origin HEAD

【讨论】:

我能得到一些关于这有什么问题的 cmets 吗?如果你想要 github 上的 origin/HEAD,这是我知道的唯一方法。 远程 HEAD 是一个符号 ref(通常指向 refs/heads/master)。您将用当前分支提交的哈希 id 替换符号 ref。 不应该在 cmets 中讨论猜测而不是作为一个不精确的答案吗?

以上是关于为啥运行“git branch -r”时显示“origin/HEAD”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java聊天室程序运行时显示“不能写入到指定服务器”?求大神!

这段C语言程序为啥运行时显示Debug error和Runtime error?怎么改?(问题截止到2019年3月17日17时00分)

为啥 jQuery FileTree 在未设置时显示文件?

为啥 Instant 在彼此之后打印时显示不同的值? [关闭]

为啥我开机时显示找不到c:\windows\system32\mcdsrv16_080119.dll,

为啥我的代码不会在测验结束时显示分数?