git branch git-checkout

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



git-checkout (1)

Hasta ahora, siempre he usado git checkout <branch_name>; git reset --hard <hash> git checkout <branch_name>; git reset --hard <hash> para mover una rama de nuevo 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 árbol de trabajo limpio, ¿cuáles son las diferencias internas 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?


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

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

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