为什么在运行“ git Branch-r”时会显示“ source/HEAD”?

当你运行 git branch -r时,为什么它会列出 origin/HEAD?例如,在 GitHub 上有一个远程回购(repo) ,比如说,它有两个分支: master 和 Awesome-Feature。如果我使用 git clone来获取它,然后进入我的新目录并列出分支,我会看到:

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

或者不管它的顺序是什么(阿尔法?我伪造这个例子是为了保守一个无辜回购者的身份)。HEAD的业务是什么?是不是最后一个到 push的人推的时候,他们的 HEAD指的就是这个?他们不是一直都这样吗?HEAD移动... 为什么我要关心别人的 HEAD指向另一台机器?

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

编辑: 我的印象是,专门的远程回购(像 GitHub,没有人会 ssh 和工作的代码,但只有拉或推等)没有,也不应该有一个头,因为基本上,没有工作的副本。不是吗?

71168 次浏览

我猜是有人推了一根树枝,把它叫做“头”:

git push origin HEAD

总是有一个头,分数的当前签出分支上的远程回购(这可能是或可能不是主人)。即使是远程存储库也有当前的分支。通常它是主人,在我的头顶上我想不出任何理由为什么一个人想要改变它,但它可以改变。

你是对的,努力专用的远程回购工作得更好,当他们是’裸’,也就是说,当他们没有工作目录。Git 的架构是为了通过补丁或 pull(fetch)进行更新而设计的,这在分布式 VCS 中是有意义的。正如文档中所说的那样,推送到当前检出的分支可能会导致 “意想不到的结果”

HEAD 是有效存储库需求的一部分:

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

我以为 专用的远程回购(如 GitHub) 没有人会进来工作的地方 那个代码,但只是拉或推等) 没有也不应该有脑袋 因为基本上没有 正在复印,不是吗?

我的印象和你说的一模一样。

我甚至不能删除从 github 克隆的起源/HEAD 远程跟踪分支

git branch -d -r origin/HEAD

这没有效果。

谁能告诉我怎样才能删除源/HEAD 远程跟踪分支?

更新

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

Git 的新版本提供

git remote set-head <name> -d

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

我们还可以通过使用

git remote rename origin <new_name>

希望这个能帮上忙。 :)

裸存储库之所以可以有一个 HEAD,是因为它决定在克隆存储库之后最初签出哪个分支。

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

@ robinst 是正确的。

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

在 GitHub 上,在 GitHub 回购的管理设置中使用 你可以改变这一切

git remote set-head origin trunk

或者通过

git remote set-head origin -d

示例 。查看“ Switch Branch”下拉列表。选中 trunk,因此 origin/HEAD跟随 trunk

如果“ source”是一个远程存储库,那么 source/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”的那一行。这是远程存储库让客户机知道默认签出哪个分支的地方。