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.
Para eso viene muy bien el comando . Para simular este escenario, primero vamos a crear una rama nueva llamada experiment.
git switch -c experimentCrea 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., añade los cambios a staging y crea un commit.
Haz todo lo anterior.
¡Perfecto! Ahora elimina la línea <!DOCTYPE html> de hello.html, añade los cambios a staging y crea un commit.
Haz todo lo anterior.
Vale, digamos que a estas alturas 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.
git reset mainRestablece 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 staging ni incluido en un commit.
Si revisas hello.html, también verás que falta <!DOCTYPE html>. Por tanto, el directorio de trabajo no se ha modificado: sigue conteniendo nuestros cambios experimentales.
Git ha movido el puntero de la rama al mismo commit que la rama main. Los commits que hemos hecho 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 en staging.
Si queremos conservar estos cambios, podemos añadirlos a staging y crear un commit con ellos como siempre. A veces, esto es exactamente lo que buscas. Por ejemplo, quizá quieras hacer squash de un montón de microcommits para reunirlos en un único commit con sentido, o dividir todos los cambios de un commit enorme en varios commits más pequeños.
En este caso, queremos quitarnos de encima todos los cambios experimentales, es decir, hacer un reset hard.
De hecho, ¿por qué no descartas ahora mismo cualquier cambio del directorio de trabajo? Puedes usar el comando que aprendimos antes (pista: empieza por la letra r y, en inglés, rima con chore). Si se te ha olvidado el comando necesario, consulta la .
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.
Comprobemos ahora el estado del repositorio.
git statusComprueba el estado del repositorio.
Los cambios de hello.html han desaparecido. Pero el archivo experiment.html sigue ahí. ¿Por qué?
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 .
rm experiment.htmlElimina el archivo experiment.html.
Vamos a comprobar ahora el estado del repositorio.
git statusComprueba el estado del repositorio.
¡Genial! Nuestra rama vuelve a tener el estado con el que la creamos.
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 staging.
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 staging. ¡Ú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 bien 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í, si ya tienes costumbre de usar el antiguo comando git reset, quizá tardes un tiempo en acostumbrarte al 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.
Haz el curso como se pensó: avanza poco a poco y en orden, sin distracciones, mientras desbloqueas nuevas entradas de Gitopedia. Cuando quieras, continúa practicando con Git de verdad en VS Code, Cursor o Antigravity IDE.
pero requiere iniciar sesión