Git Reset, Revert y Checkout Explicados
Visión General
| Comando | Modifica Historial | Área Afectada | Uso Primario |
|---|---|---|---|
| reset | Sí (local) | HEAD / Index / (Opcional) Working Dir | Reescribir progreso local |
| revert | No (agrega commit) | Crea commit nuevo | Deshacer públicamente |
| checkout | No (mueve HEAD o archivos) | HEAD o WD | Navegar / extraer archivo |
git reset
bash
git reset --soft <hash> # Solo mueve HEAD
git reset --mixed <hash> # (por defecto) HEAD + index
git reset --hard <hash> # HEAD + index + working dirCasos
| Situación | Acción |
|---|---|
| Reagrupar commits | soft |
| Quitar archivos staged | mixed |
| Descartar todo local | hard |
git revert
bash
git revert <hash>Genera un commit inverso. Seguro en ramas compartidas.
Revertir múltiples:
bash
git revert <hash1> <hash2>Revertir un merge (necesitas parent):
bash
git revert -m 1 <merge_hash>git checkout (HEAD Antiguo)
bash
git checkout <hash>Estado "detached HEAD" para inspección.
Restaurar archivo específico:
bash
git checkout HEAD -- src/app.jsEjemplo Comparativo
Escenario: Quitar último commit local (no publicado)
- Preferir:
git reset --soft HEAD~1
Escenario: Deshacer commit ya en remoto
- Usar:
git revert <hash>
Visual Mental
reset → Mueve apuntadores
revert → Añade commit inverso
git checkout <hash> → Mueve HEAD temporalmenteRiesgos
| Acción | Riesgo |
|---|---|
| reset --hard | Pérdida permanente si no referenciado |
| Revert de revert | Historial ruidoso |
| Checkout detached prolongado | Commits "huérfanos" |
Recuperación
bash
git reflog
# Encuentra hash perdido
git branch rescue <hash>Buenas Prácticas
reset --hardsolo si entiendes el impacto- Preferir revert en ramas compartidas
- Etiquetar antes de operaciones masivas
Alternativa Moderna
Para cambiar de rama en lugar de checkout:
bash
git switch <branch>Para crear y cambiar:
bash
git switch -c feature/xResumen
Elige según visibilidad: reset reescribe, revert narra, checkout observa o extrae. Usa la herramienta mínima necesaria.
