@mgorny For a single character, ~ and ^ are equivalent.
Where they differ when you add a number suffix. ~<n> means “n commits back”, like ~3 means “3 commits before”. ^<n> means “the nth parent”, like for a merge commit, ^2 means the second parent.
~ always traverses the first parent, which means the target branch for a merge—pretty much what you always want.