Разница описана
в документации.
В частности
@^
и
@~
действительно совершенно случайно выбирают одно и тоже, но у них разный смысл.
@
в данном контексте синоним
HEAD
.
^
(===
^1
) — выбрать первого родителя коммита. У большинства коммитов никакого другого и нет, так что числа отличные от 1 имею смысл только для merge-коммитов.
~
(===
~1
) — выбрать родителя (если их несколько, то выбирается первый).
Но, например,
@^3
выбрать третьего родителя у коммита. В 99.99% случаем это будет ошибка, потому что в живой природе больше двух родителей практически не бывает.
А вот
@~3
означает выбрать «пра-дедушку» коммита и это эквивалентно записи
@^1^1^1
(или
@^^^
).