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>
.