Git Reset
Última actualización
git reset mueve la rama actual a un commit diferente y, según el modo, actualiza el área de preparación (index) y el árbol de trabajo para que coincidan. Los tres modos solo se diferencian en hasta dónde llega esa actualización: --soft mueve la rama y se detiene, --mixed (el predeterminado) también restablece el área de preparación, y --hard además sobrescribe tus archivos de trabajo.
Como --hard descarta el trabajo sin confirmar, ten claro qué modo quieres antes de ejecutarlo. Prueba estos comandos de forma segura en el terminal playground: un shell real en tu navegador.
Los tres modos
| Mode | Moves branch | Resets staging | Resets working tree |
|---|---|---|---|
--soft | Sí | No | No |
--mixed (default) | Sí | Sí | No |
--hard | Sí | Sí | Sí |
Sintaxis
| Command | What it does |
|---|---|
git reset --soft HEAD~1 | Deshace el último commit, mantiene los cambios en el stage |
git reset HEAD~1 | Deshace el último commit, mantiene los cambios fuera del stage |
git reset --hard HEAD~1 | Deshace el último commit, descarta los cambios |
git reset <file> | Quita un archivo del stage (conserva sus cambios) |
git reset --hard origin/main | Fuerza la rama local a coincidir con la remota |
Casos comunes
| Goal | Command |
|---|---|
| Quitar todo del stage | git reset |
| Quitar un archivo del stage | git reset README.md |
| Retroceder 3 commits, conservando el trabajo | git reset --soft HEAD~3 |
| Descartar todos los cambios locales desde un commit | git reset --hard <hash> |
Preguntas frecuentes sobre git reset
¿Cuál es la diferencia entre --soft, --mixed y --hard?
--soft no cambia nada más, por lo que tus cambios permanecen en el stage. --mixed (el predeterminado) también limpia el área de preparación, así que los cambios salen del stage pero siguen en tus archivos. --hard además sobrescribe tu árbol de trabajo para que coincida con el commit de destino, descartando los cambios sin confirmar.¿Cómo quito un archivo del stage con git reset?
git reset <file> (por ejemplo git reset README.md), o git reset sin ruta para quitar todo del stage. Esto elimina el archivo del área de preparación pero conserva tus ediciones en el árbol de trabajo. En versiones más nuevas de Git también puedes usar git restore --staged <file>, que hace lo mismo de forma más explícita.¿Es reversible git reset --hard?
--hard descarta los cambios sin confirmar de forma permanente. Sin embargo, el trabajo ya confirmado que hayas eliminado con reset suele poder recuperarse: ejecuta git reflog para encontrar el hash del commit y luego git reset --hard <hash> (o crea una rama en él). Los cambios sin confirmar que nunca se pusieron en el stage ni se confirmaron no se pueden recuperar, así que usa --hard con cuidado.¿Cuál es la diferencia entre git reset y git revert?
git reset reescribe la historia moviendo la rama hacia atrás, lo cual está bien para commits locales, pero es peligroso en commits que ya has subido. git revert deja la historia intacta y añade un nuevo commit que deshace uno anterior, que es la opción segura para ramas compartidas.¿Puedo practicar esto en línea?
git reset en un shell real en tu navegador, sin necesidad de instalar nada. El curso interactivo y gratuito de Git de Coddy también cubre cómo restablecer y deshacer cambios paso a paso.