Git reset = retroceder en el tiempo anulando commits.
Concepto:
Analogía: es como borrar páginas de un cuaderno.
| Modo | Commits | Index/staging | Working directory |
|---|---|---|---|
| --soft | Anula | Conserva | Conserva |
| --mixed | Anula | Borra | Conserva |
| --hard | Anula | Borra | Borra |
Memo simple:
Uso: rehacer el último commit con más cambios.
mkdir demo-reset && cd demo-reset
git init
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"
# Reset soft: anula el commit, lo deja todo en staging
git reset --soft HEAD~1
git status # Cambios preparados, listos
git log --oneline # Un commit menos
cat app.py # El contenido v2 sigue ahí
# Nuevo commit con un mensaje mejorado
git commit -m "Version 2 - Avec nouvelles features"Uso: anular commits Y quitarlos del staging (modo por defecto).
echo "print('v3')" > app.py && git add . && git commit -m "Version 3"
# Reset mixed (o simplemente git reset)
git reset HEAD~1
git status # Cambios NO preparados
git log --oneline # Commits anulados
cat app.py # El contenido v3 sigue ahí, pero no en staging
# Hay que volver a añadir antes del commit
git add . && git commit -m "Version 3 - Refait proprement"PELIGRO: ¡borra TODO, incluso tus modificaciones sin commit!
echo "print('v4')" > app.py && git add . && git commit -m "Version 4"
# Modificaciones en curso
echo "print('work in progress')" >> app.py
# Reset hard: TODO DESAPARECE
git reset --hard HEAD~1
git status # Working directory limpio
cat app.py # Vuelta a v2, work in progress PERDIDOUso: cuando de verdad quieres tirarlo todo y volver atrás.
Reset es DESTRUCTIVO con commits compartidos.
NUNCA hagas esto:
git push origin main # Commits compartidos con el equipo
git reset --hard HEAD~3 # Borra 3 commits compartidos
git push --force # Fuerza el borrado en todo el mundo
# = ¡CAOS en el equipo!Regla de seguridad:
git revert (más seguro)| Comando | Acción |
|---|---|
git reset HEAD~1 | Anula 1 commit (mixed) |
git reset --soft HEAD~2 | Anula 2 commits, conserva el staging |
git reset --hard HEAD~1 | Anula 1 commit, borra TODO |
git reset <hash> | Volver a un commit concreto |
git reset --hard origin/main | Reset a la versión remota |
Reset = potente pero peligroso. ¡Úsalo con precaución!