First, to factually answer the initial need : "I was searching on doing a diff between working tree and last commit"
You'd have to simply
git diff HEAD
(HEAD
is implied for most commands but diff
is a bit different here, and yes git diff
is different from git diff HEAD
)
Now, the difference between HEAD
and HEAD~
is quite simple :
HEAD
is the pointer git uses to represent the current state being worked on, often a branch. (see the glossary)
~
means the designated commit's parent. So HEAD~
means "not last commit but the one before that"
With such a tree :
---> time direction this way --->
A---B---C <<< master <<< HEAD
HEAD
would resolve to commit C
, while HEAD~
would resolve to B
Edit to clarify about HEAD^
HEAD^
and HEAD~
both point (if we stick to our example) to B
, but it shouldn't mislead you into thinking they're the same.
<someCommit>^N
(where N=1
if not explicitly given) means the designated commit's Nth parent when said commit has multiple parents. For a classic two parents merge, if HEAD
points to the merge commit, parents can be found with HEAD^
and HEAD^2
.
<someCommit>~N
(again, N
defaulting to 1) , in the other hand, means Nth ancestor of said commit, meaning you go back N commits in the past, following only one parent each time. For better clarity, in our example, HEAD~2
would designate A