Разница между @~ и @^?
Эти символы абсолютно идентичны. Используются для относительных ссылок назад в историю от какой либо точки. 
Например git reset HEAD^3 переключит текущую ветку на три коммита назад относительно текущего состояния.
Разница описана в документации.

В частности @^ и @~ действительно совершенно случайно выбирают одно и тоже, но у них разный смысл.

@ в данном контексте синоним HEAD.
^ (=== ^1) — выбрать первого родителя коммита. У большинства коммитов никакого другого и нет, так что числа отличные от 1 имею смысл только для merge-коммитов.
~ (=== ~1) — выбрать родителя (если их несколько, то выбирается первый).

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