title: "Git's HEAD" description: > Basic differences between HEAD, HEAD^, and HEAD~N categories: posts
In git literature is common to come across HEAD
, HEAD^
, and HEAD~N
.
Unfortunately, they usually don't come with an explanation.
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).