Comandos de Git

git reset

git reset: restablece HEAD y la rama actual a un commit distinto.

git reset es un comando de Git que se usa sobre todo para mover HEAD y la rama actual hasta un commit concreto; en la práctica, "rebobina" el historial del proyecto a un estado anterior. Este comando resulta útil cuando necesitas deshacer commits que se han creado en la rama actual.

Cuando usas git reset, es como decirle a tu repositorio Git que olvide que ciertos cambios llegaron a pasar y que trate un estado anterior como el estado actual del proyecto. Viene muy bien para deshacer cambios, simplificar historiales enrevesados o incluso combinar varios commits en uno antes de compartirlos con otras personas.

Históricamente, git reset se usaba para varias cosas, entre ellas restablecer el directorio de trabajo y el área de preparación. A día de hoy, muchos desarrolladores veteranos siguen usando git reset para esas tareas. Sin embargo, desde la llegada de git restore en Git 2.23.0, ahora se recomienda usar git restore para gestionar el directorio de trabajo y el área de preparación, mientras que git reset debería usarse sobre todo para mover HEAD y el puntero de la rama actual.

Con git restore es menos probable romper algo por accidente, porque es más específico y menos destructivo que git reset. Si ya tienes la costumbre de usar el viejo git reset, quizá tardes un poco en acostumbrarte al nuevo comando. Pero si Git todavía te suena nuevo, merece la pena entender la diferencia e intentar usar git restore en vez de git reset cuando encaje.

Ejemplos

Mover el puntero de la rama actual a un commit concreto. Esto mantiene los cambios en el directorio de trabajo, así que puedes modificarlos y crear otro commit con ellos si hace falta. Útil para modificar un commit existente:

git reset a1b2c3d4

Mover el puntero de la rama actual a un commit concreto y restablecer el área de preparación para que coincida, pero sin tocar el directorio de trabajo. Útil para conservar los cambios que has hecho, pero empezar un commit nuevo:

git reset --soft a1b2c3d4

Mover el puntero de la rama actual a un commit concreto y descartar todos los cambios del área de preparación y del directorio de trabajo. Útil para descartar por completo cambios que no están en ningún commit. Ten cuidado: ¡esta acción no se puede deshacer!

git reset --hard a1b2c3d4

En vez de un hash de commit, también puedes usar referencias relativas: mover el puntero de la rama actual un commit hacia atrás:

git reset HEAD~1

Ten cuidado al usar git reset, sobre todo con la opción --hard, porque puede descartar cambios de forma permanente. Comprueba siempre que estás restableciendo la rama al commit correcto y plantéate usar git stash para guardar tus cambios sin incluir en un commit antes de restablecer la rama si crees que podrías necesitarlos más tarde.

Ten en cuenta que git reset no elimina commits por completo; en realidad, solo mueve el puntero de la rama. Los commits "eliminados" siguen en el historial del repositorio (puedes acceder a ellos mediante su hash de commit), pero ya no son alcanzables desde la rama actual. Esto significa que puedes recuperarlos si hace falta, aunque ya no aparecerán en el historial de la rama.