¿Cuál es la diferencia entre los formattings de revisión de git refname @ {n} y rev ~ n

La página man hace una distinción de la siguiente manera

Citar a hombre gitrevisions …

Por ejemplo, master @ {1} es el valor anterior inmediato de master mientras que master @ {5} es el 5to valor anterior de master.

Y

Un sufijo ~ <n> para un parámetro de revisión significa el object de confirmación que es el <n> abuelo principal de generación del object de confirmación nombrado, siguiendo solo los primeros padres.

Fin de cita

Entiendo que las generalizaciones de estos formattings separados conducen a diferentes patrones de uso, pero la diferencia en la terminología (por ejemplo, "valor anterior" vs "abuelo principal") me hace pensar que podría haber alguna diferencia.

¿Es master @ {n} lo mismo que master ~ n?

Disculpas si esta es una pregunta frecuente, pero este es el tipo de cosas que es difícil de googlear.

No, no son lo mismo. Para comprender por qué, deberá comprender el reflog . Piense en el reflog como una tabla de logging gigante de todas las confirmaciones que las twigs de su repository solían señalar ("valor anterior", si lo prefiere).

Entonces ese es el reflog y te permite volver a los valores pasados ​​de las twigs. master@{5} fue lo que el maestro solía señalar en 5 events atrás (si esos events fueron commits realizados o resets de master, etc.)

La otra syntax, master^5 y master~5 , son más de lo que esperas. Estos tratan con los padres del compromiso que el maestro está señalando actualmente.