Git deshacer alias no funciona correctamente

Me gustaría algo de ayuda para hacer que este alias funcione correctamente:

[alias] undo = "!f() { git reset --hard HEAD@{$1-1}; }; f" 

El objective es poder ejecutar:

git undo sin parameters y hacer que vuelva a la acción anterior (HEAD @ {1})

git undo 2 retrocedería a la 2da acción anterior

Cuando lo ejecuto, no veo el comportamiento esperado:

git deshacer

fatal: argumento ambiguo 'HEAD @ {- 1}': revisión desconocida o ruta no en el tree de trabajo. Use '-' para separar las routes de las revisiones, como esta: 'git […] – […]'

git undo 2

advertencia: el logging para 'HEAD' solo vuelve a Vie, 18 Mar 2016 12:00:10 -0700. advertencia: el logging para 'HEAD' solo vuelve a Vie, 18 Mar 2016 12:00:10 -0700. HEAD ahora está en 66b5b26 Confirmación inicial

Después de llamar a git undo 2 la última input de reflog muestra:

66b5b26 HEAD @ {0}: reset: moviéndose a HEAD @ {2-1}

¿Cómo configuro este alias correctamente?

Si te estoy entendiendo, quieres que se comporte de esta manera:

 git undo # HEAD@{1} git undo 1 # HEAD@{1} git undo 5 # HEAD@{5} 

Entonces creo que esto debería funcionar, asumiendo un shell como bash o zsh:

 undo = "!f() { git reset --hard HEAD@{${1-1}}; }; f" 

Si quieres ver lo que hará sin que haga nada, simplemente coloca el echo delante de git reset en el alias, y te mostrará lo que se habría ejecutado.

Como se mencionó en otra respuesta , y también se menciona aquí, esto arrojará silenciosamente cambios locales en el directory de trabajo, por lo que debe usarse con precaución.

No está del todo claro qué es exactamente lo que buscas. Supongo que estás buscando estas expansiones:

 git undo ==> git reset --hard HEAD@{0} git undo 1 ==> git reset --hard HEAD@{0} git undo 2 ==> git reset --hard HEAD@{1} git undo 3 ==> git reset --hard HEAD@{2} 

Si eso es lo que estás buscando, puedes usar

 undo = "!f() { git reset --hard HEAD@{$((${1:-1} - 1))}; }; f" 

Tenga en count que este alias es bastante peligroso. Caerá silenciosamente todos los cambios locales en su directory de trabajo.