You see the Git documentation saying things like
The branch must be fully merged in HEAD.
But what is Git HEAD
exac
Take a look at Creating and playing with branches
HEAD is actually a file whose contents determines where the HEAD variable refers:
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed
In this repository, the contents of the HEAD file refers to a second file named refs/heads/master. The file refs/heads/master contains the hash of the most recent commit on the master branch.
The result is HEAD points to the master branch commit from the .git/refs/heads/master file.
HEAD is just a special pointer that points to the local branch you’re currently on.
From the Pro Git book, chapter 3.1 Git Branching - Branches in a Nutshell, in the section Creating a New Branch:
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.
In addition to all definitions, the thing that stuck in my mind was, when you make a commit, GIT creates a commit object within the repository. Commit objects should have a parent ( or multiple parents if it is a merge commit). Now, how does git know the parent of the current commit? So HEAD is a pointer to the (reference of the) last commit which will become the parent of the current commit.
I'd just like to detail a few things in Greg Hewgil's accepted answer. According to the Git Pocket Guide
Branch:
the branch itself is defined as all points reachable in the commit graph from the named commit (the “tip” of the branch).
HEAD: A special type of Ref
The special ref HEAD determines what branch you are on...
Refs
Git defines two kinds of references, or named pointers, which it calls “refs”:
- A simple ref, which points directly to an object ID (usually a commit or tag)
- A symbolic ref (or symref), which points to another ref (either simple or symbolic)
As Greg mentioned, HEAD can be in a "detached state". So HEAD can be either a simple ref (for a detached HEAD) or a symref.
if HEAD is a symbolic ref for an existing branch, then you are “on” that branch. If, on the other hand, HEAD is a simple ref directly naming a commit by its SHA-1 ID, then you are not “on” any branch, but rather in “detached HEAD” mode, which happens when you check out some earlier commit to examine.
It feels like that HEAD
is just a tag for the last commit that you checked out.
This can be the tip of a specific branch (such as "master") or some in-between commit of a branch ("detached head")
Take a look at http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is
Figure 3-5. HEAD file pointing to the branch you’re on.