6. Historial

Restablecer ramas

A veces quizá quieras deshacer una serie de commits y devolver tu rama a un estado anterior.

Imagina que he estado experimentando con unas funcionalidades nuevas en una rama, pero después de unos cuantos commits me doy cuenta de que el enfoque no funciona. Quiero descartar todos esos commits experimentales y empezar de nuevo desde el punto en el que la rama se separó originalmente de main.

¿Qué haces en este caso?

Aquí es donde viene muy bien el comando

. Para simular este escenario, primero vamos a crear una rama nueva llamada experiment.

Ejecuta en la terminal:
git switch -c experiment
Tarea
Completada

Crea una rama nueva llamada experiment y cambia a ella.

¡Genial! Ahora vamos a crear un archivo experiment.html. Pon dentro la cadena This is an experiment., prepara los cambios y crea un commit.

Tarea
Completada

Haz todo lo anterior.

¡Perfecto! Ahora elimina la línea <!DOCTYPE html> de hello.html, prepara los cambios y crea un commit.

Tarea
Completada

Haz todo lo anterior.

Vale, digamos que en este punto he recobrado la cordura visto que este experimento no va a ninguna parte. Quiero restablecer la rama experiment al estado inicial y descartar todos los commits experimentales.

Para hacerlo, podemos usar el comando git reset seguido de la referencia al commit al que queremos volver. En este caso, queremos volver al commit desde el que se creó la rama experiment. En otras palabras, es el último commit de la rama main. Así que, en vez de indicar un hash de commit, podemos usar el nombre de la rama que apunta a ese commit: main.

Ejecuta en la terminal:
git reset main
Tarea
Completada

Restablece la rama experiment al último commit de main.

Si ahora comprobamos el estado del repositorio, veremos que el archivo experiment.html sigue ahí, pero Git lo considera sin seguimiento. Esto significa que no está en el área de preparación ni incluido en un commit.

Si revisas hello.html, también verás que falta <!DOCTYPE html>. Así que el directorio de trabajo no ha cambiado de verdad. Sigue conteniendo nuestros cambios experimentales.

Mmm... entonces, ¿qué ha cambiado?

Git movió el puntero de la rama al mismo commit que la rama main. Los commits que hicimos en la rama experiment ya no forman parte del historial de esa rama. Esto se llama reset mixed: el historial de la rama retrocede, pero los cambios se quedan en el directorio de trabajo y ya no están preparados.

Si queremos conservar estos cambios, podemos prepararlos y crear un commit con ellos como siempre. A veces, esto es exactamente lo que buscas. Por ejemplo, si quisiéramos combinar con squash un montón de microcommits en un único commit con sentido, o si quisiéramos dividir todos los cambios de un commit enorme en varios commits más pequeños, etc.

En este caso, queremos quitarnos de encima todos los cambios experimentales, es decir, hacer un reset hard.

¡Sí que queríamos restablecerlo todo!

De hecho, ¿por qué no descartas ahora mismo cualquier cambio del directorio de trabajo? Puedes usar el comando que aprendimos hace un tiempo (pista: empieza por la letra r y, en inglés, rima con chore). Si olvidaste el comando necesario, consulta la .

Tarea
Completada

Descarta los cambios del directorio de trabajo.

¡Bien hecho! En realidad, podríamos haber hecho el reset hard con un solo comando añadiendo la opción --hard al comando git reset. Ejecutar git reset --hard me ha sacado de más de un lío.

Vamos a comprobar ahora el estado del repositorio.

Ejecuta en la terminal:
git status
Tarea
Completada

Comprueba el estado del repositorio.

Los cambios de hello.html han desaparecido. Pero el archivo experiment.html sigue ahí. ¿Por qué?

Veamos qué está pasando...

Como este archivo no tiene seguimiento, Git no sabe nada de él. No forma parte del repositorio, así que el comando git reset no le afecta. Si queremos eliminar por completo este archivo, basta con borrarlo con el comando

.

Ejecuta en la terminal:
rm experiment.html
Tarea
Completada

Elimina el archivo experiment.html.

Vamos a comprobar ahora el estado del repositorio.

Ejecuta en la terminal:
git status
Tarea
Completada

Comprueba el estado del repositorio.

¡Genial! Nuestra rama vuelve a estar en el estado en el que estaba cuando la creamos.

Tarea
Completada

Antes de continuar, cambia a la rama main.

Si quieres conservar los cambios de los commits descartados, puedes usar git reset --soft en vez de git reset. Esto restablecerá el puntero de la rama, pero mantendrá todos los cambios de los commits descartados en el área de preparación.

Si quieres eliminar por completo todo rastro de los commits descartados, puedes usar git reset --hard. Esto restablecerá el puntero de la rama y descartará todos los cambios del directorio de trabajo y del área de preparación. ¡Úsalo con muchísimo cuidado!

Ten cuidado al usar git reset, sobre todo con la opción --hard, porque puede descartar cambios de forma permanente. Comprueba siempre dos veces que estás restableciendo la rama al commit correcto. Si crees que podrías necesitar más adelante esos cambios sin incluir en un commit, guárdalos en stash con git stash antes de restablecer.

El comando git reset se parece un poco a git restore, al menos por el nombre. Ambos pueden usarse para deshacer cambios en el directorio de trabajo. Sin embargo, git restore es más nuevo y hace menos cosas: puede restaurar archivos en el directorio de trabajo, pero no mueve el puntero de la rama. De hecho, por eso se introdujo este comando: para separar el movimiento del puntero de la rama de la restauración de archivos. Cuando usas git restore, es menos probable que rompas algo por accidente, porque es más específico y menos destructivo que git reset.

Aun así, a quien ya tiene costumbre de usar el antiguo comando git reset puede llevarle un tiempo acostumbrarse al comando nuevo. Pero si Git todavía te suena nuevo, conviene entender la diferencia e intentar usar git restore en lugar de git reset cuando toque.

Next step
¿Quieres probar el modo historia?

Haz el curso como estaba pensado: progreso en pequeñas dosis, un orden lineal y sin distracciones, y entradas de Gitopedia que se desbloquean poco a poco. Continúa con Git real en VS Code/Cursor/Antigravity/Windsurf cuando quieras.

Modo historia
GRATIS
pero requiere iniciar sesión