Sinopsis
git reset [--soft | --mixed | --hard] [<commit>]
git reset [<commit>] [--] <pathspec>...
Descripción
El comando git reset mueve el puntero del branch actual a un commit especificado y opcionalmente actualiza el index y el árbol de trabajo. Es uno de los comandos más poderosos y peligrosos de Git: --hard puede destruir trabajo no commiteado.
Tres modos: --soft (solo mueve HEAD), --mixed (predeterminado: mueve HEAD y resetea index), --hard (mueve HEAD, resetea index y árbol de trabajo). El reflog conserva el HEAD anterior durante 90 días, así que la mayoría de errores son recuperables.
En el uso diario, este comando se integra estrechamente con alias de shell, plugins de editor e integración continua. Los usuarios avanzados a menudo añaden alias que combinan los flags que siempre pasan. El formato de salida puede personalizarse vía configuración de Git. Cuando algo sale mal, ejecuta el comando con GIT_TRACE=1 para revelar las llamadas plumbing subyacentes.
Entender cómo este comando interactúa con el resto del modelo de datos de Git rinde dividendos. Cada comando opera sobre algún subconjunto de las piezas (objetos, index, refs, árbol de trabajo), y saber cuáles toca ayuda a predecir resultados y a recuperarse de errores.
Opciones comunes
| Opción | Descripción |
|---|---|
--soft | Move HEAD only; index and working tree unchanged. |
--mixed (default) | Move HEAD and reset the index; working tree unchanged. |
--hard | Move HEAD, reset index, and overwrite working tree. |
--keep | Like --hard, but abort if local changes would be lost. |
--merge | Reset the index and updates files that differ between HEAD and target, keeping local merges. |
-p | Interactively select hunks to unstage. |
Ejemplos
git reset HEAD~1
# Move back one commit; keep changes in working tree
git reset --soft HEAD~3
# Combine the last 3 commits into a single staged change
git reset --hard origin/main
# Discard ALL local commits and changes (dangerous)
git reset HEAD config.yml
# Unstage a single file (older syntax for git restore --staged)
Errores comunes
git reset --hard on a branch with unpushed commits loses them. Reflog can save you within ~90 days, but only if you know to look. Confusing git reset HEAD file (unstage) with git reset --hard (nuke) is a classic beginner footgun. Modern Git provides git restore --staged as a clearer alternative.
Comandos relacionados
git restore, git revert, git reflog, git stash