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