您可以看到Git文档中这样说
分支必须在HEAD中完全合并。
但Git HEAD到底是什么?
您可以看到Git文档中这样说
分支必须在HEAD中完全合并。
但Git HEAD到底是什么?
当前回答
除了所有的定义之外,让我印象深刻的是,当你进行提交时,GIT会在存储库中创建一个提交对象。提交对象应该有一个父对象(如果是合并提交则有多个父对象)。现在,git如何知道当前提交的父节点?因此HEAD是一个指针,指向最后一次提交(引用),它将成为当前提交的父对象。
其他回答
Git中的HEAD是什么?(概念)
HEAD是一个指向当前签出分支或提交的指针,它回答了一个问题:我现在在存储库的哪个位置?或者,换句话说,它是Git知道在哪个提交上镜像本地工作树的方式,以及您当前是否在一个分支上工作(附加的)或没有(分离的)。
分离的头
HEAD可以处于附加或分离两种状态之一,这取决于是否签出了分支。默认状态是附加的,其中对历史的任何操作都会自动记录到HEAD当前引用的分支。
在分离状态下,可以在不影响任何现有分支的情况下进行实验更改。请参见下面的信息图,说明在附加状态和分离状态下提交的区别。
一个常见的误解是,消息You are in 'detached HEAD' state是错误的语气,而实际上它只是描述HEAD是如何引用当前快照的。
可以使HEAD处于分离状态的操作:
签出一个特定的提交,即。 $ git checkout 14ko3 显式地签出一个远程分支,即。 $ git checkout origin/master 使用分离标志切换到一个分支,即。 $ git主开关——分离 签出一个标签,即 $ git checkout v1.0.1 执行交互式重基,或包含冲突更改的常规重基
从分离到依附的状态
要从分离状态切换到附加状态,您可以从所在的位置创建一个新分支,或者切换回现有的分支。
注意:如果你切换到另一个现有的分支,在分离状态下创建的任何提交最终(垃圾收集后)都会被丢弃,而不是首先在一个新的分支中持久化你的更改。
检查HEAD的状态
可以通过不同的方法来确定HEAD当前处于哪个状态,这里有两个选项。
使用显示 $ git show HEAD—一行 14ko3 (HEAD, master) C1 #如果附加,输出将是 14ko3 (HEAD -> master) C1 使用状态 $ git状态 HEAD在14ko3分离
HEAD到底是什么?(技术)
如果您想显式地查看HEAD引用了什么,您可以检查. Git /HEAD文件,这是Git内部用于管理HEAD的实际文件。该文件包含分支的名称或提交散列,这取决于是否分离HEAD。
$ cat .git/HEAD
ref: refs/heads/master
# If detached, the output would have been
14ko36e295f1a98ec57397b3acc7bc247da61ff5
来源:以上节选自这篇关于主题的完整文章:Git中的HEAD是什么?
HEAD指的是工作副本所指向的当前提交,即当前签出的提交。从官方Linux内核文档中指定Git修订:
HEAD命名您在工作树中基于更改的提交。
但是请注意,在即将到来的Git 1.8.4版本中,@也可以用作HEAD的简写,Git贡献者Junio C Hamano在他的Git Blame博客中指出:
你可以不说“HEAD”,而说“@”。“git log @”。
Stack Overflow用户VonC在回答另一个问题时还发现了一些有趣的信息,关于为什么选择@作为简写。
同样值得注意的是,在某些环境中,没有必要将HEAD大写,特别是在使用不区分大小写文件系统的操作系统中,特别是Windows和OS X。
在阅读了之前所有的答案后,我仍然想要更清楚。git官方网站http://git-scm.com/blog上的这个博客给了我想要的东西:
HEAD:指向最后一次提交快照的指针
Git中的HEAD是指向当前分支引用的指针,而当前分支引用又是指向您所做的最后一次提交或检出到工作目录的最后一次提交的指针。这也意味着它将是你下一次提交的父节点。通常最简单的想法是,HEAD是上次提交的快照。
引用别人的话:
A head is simply a reference to a commit object. Each head has a name (branch name or tag name, etc). By default, there is a head in every repository called master. A repository can contain any number of heads. At any given time, one head is selected as the “current head.” This head is aliased to HEAD, always in capitals". Note this difference: a “head” (lowercase) refers to any one of the named heads in the repository; “HEAD” (uppercase) refers exclusively to the currently active head. This distinction is used frequently in Git documentation.
可以在这里找到另一个很好的源代码,它可以快速覆盖git的内部工作原理(因此可以更好地理解heads/HEAD)。引用(ref:)或头或分支可以被看作是粘贴在提交历史记录中的提交上的便利贴。通常它们指向一系列提交的提示,但它们可以随着git checkout或git reset等移动。
HEAD只是一个特殊的指针,它指向您当前所在的本地分支。
从Pro Git书籍3.1章Git分支-果壳中的分支,在部分创建一个新的分支:
What happens if you create a new branch? Well, doing so creates a new pointer for you to move around. Let’s say you create a new branch called testing. You do this with the git branch command: $ git branch testing This creates a new pointer at the same commit you’re currently on How does Git know what branch you’re currently on? It keeps a special pointer called HEAD. Note that this is a lot different than the concept of HEAD in other VCSs you may be used to, such as Subversion or CVS. In Git, this is a pointer to the local branch you’re currently on. In this case, you’re still on master. The git branch command only created a new branch — it didn’t switch to that branch.