Git分支命名为origin/HEAD -> origin/master。

55

我对 Git 还比较新手,正在逐渐熟悉它。最近我才开始使用分支,在这方面遇到了一些问题。

我有两台开发系统,一台是 Ubuntu 桌面版,另一台是 MacBookPro。我在 Ubuntu 系统中的一个名为 organizations 的新分支上做了很多工作,并进行了提交和推送到远程仓库。此时,我有了以下这些分支:

tauren@ubuntu:/projects$ git branch
  accounting
  master
* organizations

tauren@ubuntu:/projects$ git branch -r
  origin/accounting
  origin/master
  origin/organizations
  origin/superstar

然后我切换到MBP来拉取新分支:

tauren@osx:/projects$ git branch
  accounting
* master

tauren@osx:/projects$ git branch -r
  origin/HEAD -> origin/master
  origin/accounting
  origin/master
  origin/superstar

tauren@osx:/projects$ git pull
   2e20a14..ef35730  accounting -> origin/accounting
   271a1a5..7e947ab  master     -> origin/master
 * [new branch]      organizations -> origin/organizations

tauren@osx:/projects$ git branch
* accounting
  master

tauren@osx:/projects$ git branch -r
  origin/HEAD -> origin/master
  origin/accounting
  origin/master
  origin/organizations
  origin/superstar

所以我的问题是:

  1. 为什么MBP有一个分支 origin/HEAD -> origin/master,但Ubuntu系统没有?那个分支是什么意思?
  2. git pull 命令是否会自动拉取所有新的远程分支?我原本以为我需要告诉它要拉取哪些新分支。正如你所看到的,它在执行 git pull 命令时拉取了远程的 organizations 分支。
3个回答

51

HEAD 通常指向当前检出的分支。在托管(裸)存储库中,它指定默认分支,即克隆存储库时检出的分支。因此, origin/HEAD 告诉您 origin 的默认分支。

我不知道为什么在 Ubuntu 系统上的存储库中没有它。也许您最初从该存储库推送了代码(当 origin 为空且尚未有 HEAD 时),并从未更新过它。

实际上,拥有像 origin/HEAD 这样的东西并不是非常重要。如果需要,您可以使用 git remote set-head origin -a 来创建/更新 origin/HEAD

回答您的另一个问题:如果您运行不带参数的 git pull,它会实际从远程获取所有内容(git fetch 同样也是不带参数运行的,所以它只是获取所有内容)。但是,并不会合并所有内容。只有远程跟踪分支(git branch -r 中的内容)会被更新。


6
哦,我忘了提到:您可以使用 git remote set-head origin -a 命令来创建/更新 origin/HEAD。 - Jan Krüger
3
git remote set-head文档有助于理解 origin/HEAD 的目的。 - millerdev

12

它只是一个指向主分支的指针,如果您愿意,可以将其视为符号链接。 您可以通过在终端(或Windows用户的git bash / cygwin)中执行以下操作来安全地删除它:

  1. 导航到您的存储库
  2. 执行:git remote set-head origin -d

现在它应该已经消失了:

$ git branch -r
origin/master

11
据我所知,HEAD不是一个分支,而是指向历史树中节点(即提交)的指针。你特定工作副本中存在的文件状态由HEAD描述。
通常情况下,HEAD指向分支中最新的提交,因此在工作副本中有最新的文件。使用git reset HEAD^可以将指针移动到上一个提交(即撤销本地副本中的上次提交)。
现在,每个git仓库都有一个HEAD,可以使用git show HEAD进行检查。相应地,origin/HEAD是你的origin远程的HEAD
现在,我找到了一个描述HEAD的好问题: What is HEAD in Git?

1
已经过去了10年,但分支仍然是指针! - Simón Ramírez Amaya

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