¿Cuál es la diferencia entre “git checkout -f” y “git reset --hard HEAD”?

81

Necesito revertir los cambios locales para las implementaciones. (Lo había usado svn revertpara esto en los días de SVN de la vieja escuela).

Y lo estoy usando git reset --hard HEADpara esto. (También git fetchy git merge origin/$branch --no-ffpara sincronizar con la rama ascendente).

Pero algunos artículos apuntan git checkout -fa revertir los cambios.

¿Cuáles son las diferencias clave entre estos comandos? ¿Qué camino es el recomendado?

osm
fuente

Respuestas:

64

Los dos tienen exactamente el mismo efecto. Te recomiendo que elijas la solución con la que te sientas más cómodo.

Pero si en este caso particular el efecto es el mismo, con valores diferentes sería completamente diferente. Básicamente (hay más, vea los temas vinculados) con un reinicio, mueve la rama actual y el HEAD a una confirmación específica, pero con un pago, solo mueve el HEAD. Para obtener más detalles, consulte a continuación.


Recursos:

Sobre el mismo tema:

Colin Hebert
fuente
13

Aún no tengo el representante para comentar sobre otras respuestas, solo quería agregar que encontré un caso en el que los dos comandos NO tienen el mismo efecto. Entré en un estado extraño, así que este es definitivamente un caso límite. Esto es lo que sucedió:

Estaba en una sucursal, todo limpio. Revisé el maestro git checkout mastery descubrí git statusque había cambios en los archivos existentes que no se prepararon para una confirmación (sí, en el código que acabo de verificar). Intenté esconderlo para volver a un estado limpio, el alijo decía haberse completado, pero git statusaún no había cambiado. También lo intenté git reset --hard HEAD. También informó que se completó con éxito, pero el estado no fue diferente. No pude abortar estos extraños cambios.

Sin embargo, git checkout -fresolvió esto. Pude escapar de este extraño estado. Entonces, al menos de alguna manera, los dos no son lo mismo.

usuario1807768
fuente
Simplemente tuve exactamente la misma situación. Hubo un montón de archivos modificados que git reset --hard HEAD no haría desaparecer, pero git checkout -f lo hizo, por lo que claramente no son los mismos en algún nivel.
Mike Wasson
1
En nuestro caso, se debió al cambio de permisos de archivo; esto lo solucionó stackoverflow.com/questions/1257592/…
Mike Wasson
2
También es posible que tenga este problema si su configuración de final de línea de git está un poco desordenada y está tratando de convertirla al finalizar la compra.
Simon East