2019-01-06-gits-head.md 1.4 KB


title: "Git's HEAD" description: > Basic differences between HEAD, HEAD^, and HEAD~N categories: posts

tags: [git, development]

In git literature is common to come across HEAD, HEAD^, and HEAD~N. Unfortunately, they usually don't come with an explanation.

The Tree

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A

The illustration above, by Jon Loeliger, depicts a commit history tree. We can think about it as: (from A's view point)

A = HEAD    = HEAD^0
B = HEAD^   = HEAD^1     = HEAD~1
C = HEAD^2  = HEAD^2
D = HEAD^^  = HEAD^1^1   = HEAD~2
E = B^2     = HEAD^^2
F = B^3     = HEAD^^3
G = HEAD^^^ = HEAD^1^1^1 = HEAD~3
H = D^2     = B^^2       = HEAD^^^2 = HEAD~2^2
I = F^      = B^3^       = HEAD^^3^
J = F^2     = B^3^2      = HEAD^^3^2

Where ^N stands for the Nth parent commit. That is, those commits immediately before it, regardless of branch of origin. ^1 can be shorten to ^. Each parent is indexed from left to right, and relative to it's child.

~N abbreviates N contiguous ^1 parents. Which means, that set of commits forms a branch; like G-D-B-A above. We can think of it as HEAD's N previous commits.

For more info read the specifying revision{:rel="nofollow noreferrer noopener"} section on git-rev-parse(1).