Diferencia entre `git branch -f <branch_name> <hash>` y `git checkout <branch_name>; git reset –hard <hash> `debajo de un tree de trabajo limpio?

Hasta ahora, siempre he usado git checkout <branch_name>; git reset --hard <hash> git checkout <branch_name>; git reset --hard <hash> para mover una twig a una confirmación anterior.

Luego me encontré con esta pregunta , pero las respuestas y los comentarios no explican con gran detalle las diferencias entre ellos.

Suponiendo que tengo un tree de trabajo limpio, ¿qué diferencias internas hay entre

 git branch -f <branch_name> <hash> 

y

 git checkout <branch_name> git reset --hard <hash> 

y ¿tales diferencias, si las hay, tienen sutiles implicaciones para el uso avanzado?

La principal diferencia es que git branch -f <branchname> <commitref> mueve <branchname> para señalar el commit especificado sin tocar HEAD , el índice o la copy de trabajo , mientras que git checkout <branchname> && git reset --hard <commitref> modifica los tres.

Si desea reorganizar rápidamente las twigs sin mover HEAD o modificar su tree de trabajo actual, entonces git branch -f es una buena forma de hacerlo. También funcionará si tienes cambios no confirmados , lo que no siempre es posible si usas git checkout .

Otra diferencia está relacionada con el performance, pero solo es relevante para proyectos muy grandes.
En esos casos, modificar su tree de trabajo con git checkout y git reset --hard podría ser una operación costosa con muchas E / S de disco. Por otro lado, con git branch -f solo se escribirá un único file en el disco, es decir, el que contiene el <commithash> referencedo por <branchname> .