HEAD和Master之间的区别


187

HEADmasterGit 之间有什么区别?

我在GitHub上克隆了一个项目,并希望将更改推送到远程。但是我应该推到哪一个?

屏幕截图

Answers:


162

master是对分支结束的引用。按照惯例(默认情况下),这通常是主要的集成分支,但不一定必须如此。

HEAD实际上是一种特殊类型的引用,它指向另一个引用。它可能指向master 或不指向(它将指向当前签出的任何分支)。如果您知道要提交到master分支,则请推送至此。

这是一个视觉示例:

替代文字

在您自己的存储库中,您可以HEAD通过运行以下命令检查指向的位置:

$ git symbolic-ref HEAD
refs/heads/master

但是,找出remotes/origin/HEADs指向的位置比较麻烦,因为它位于远程计算机上。

这里有一个关于git参考的很棒的小教程:

http://people.gnome.org/~federico/news-2008-11.html#pushing-and-pulling-with-git-1


1
+1比我的答案更精确。有关这些概念的说明,另请参阅stackoverflow.com/questions/3301956/…stackoverflow.com/questions/3301956/…
VonC

37

简单的答案是HEAD指向您当前所在分支的最新提交的指针/标签。master是初始化git存储库(例如git init)时创建的默认分支。

您可以删除 master分支(例如git branch -D master)。您不能删除HEAD指针。


6
HEAD是指向您当前所在分支的最新提交的指针/标签。” 我认为这充其量是一种误导。如果您签出一个较早的提交,则HEAD现在是指向该较早提交而不是最新提交的指针。对?
LarsH

2
你是对的。HEAD是您最近一次结帐。但以我的辩护,对于Git,该checkout命令等效于切换其他常见SCM系统中的分支。
benhorgen '16

1
我很同情...我很容易犯同样的错误。我注意到的唯一原因是因为我正处于研究HEAD真正含义的阶段。您是否有可能将答案编辑为正确的?对于像我这样的git非专家来说,我发现HEAD是一个很难找到准确描述的概念。而且,如果有建议可以在网络上闲逛,从而给出有关HEAD的错误信息,则会使工作变得相当困难。
LarsH'Apr 1'16

2
我认为您的评论对任何想更好地了解Git HEAD指针真正含义的人来说都是一个奇妙的澄清。我感谢您的评论,并认为其他人也会如此。我原始帖子的内容与您的后续评论相辅相成。谢谢。
benhorgen '16

4
一种技术性,但是如果签出一个较早的提交,您将不再处于“分支”上。如果您签出一个提交而不是一个分支,那么您将拥有一个称为“分离头”的东西,那么您将不再处于“分支”上。“在分支上”意味着您的HEAD正在引用一个分支,并且根据定义,您在该分支的最新提交中。仅仅因为您已经提交了'b54fe7'提交,并且master指向该提交,并不意味着您就在master分支上。可能有多个分支指向同一提交,如果有的话,您位于HEAD所指向的分支上。
杰森·古玛

8

只需推动您当前分支的更改

git push origin

它将把您的分支“ B”更改为“ origin/B”。
如果您在master分支机构,则git将推送到origin/master
实际上,它将在上匹配远程分支的本地分支上推送所有更改origin。它由配置设置push.default控制
另请参阅在Pro Git书中推送RefSpecs


您将看到的是侧边栏,该侧边栏代表GitX项目实验性GitX分支中的远程回购的所有refspec

替代文字

HEAD将指定默认分支为远程。
参见git remote set-head手册页

不需要具有远程的默认分支,但是可以指定远程的名称来代替特定的分支。
例如,如果将的默认分支origin设置为master,则origin可以在通常指定的任何位置指定origin/master

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.