Diferencia entre `git branch -f <nombre de rama> <hash>` y `git checkout <nombre de rama>; git reset --hard <hash> `debajo de un árbol de trabajo limpio?

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

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

Suponiendo que tengo un árbol 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 implicaciones sutiles para el uso avanzado?

Respuestas a la pregunta(1)

Su respuesta a la pregunta