Skip to content

Git Reset, Revert y Checkout Explicados

Visión General

ComandoModifica HistorialÁrea AfectadaUso Primario
resetSí (local)HEAD / Index / (Opcional) Working DirReescribir progreso local
revertNo (agrega commit)Crea commit nuevoDeshacer públicamente
checkoutNo (mueve HEAD o archivos)HEAD o WDNavegar / 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 dir

Casos

SituaciónAcción
Reagrupar commitssoft
Quitar archivos stagedmixed
Descartar todo localhard

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.js

Ejemplo 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 temporalmente

Riesgos

AcciónRiesgo
reset --hardPérdida permanente si no referenciado
Revert de revertHistorial ruidoso
Checkout detached prolongadoCommits "huérfanos"

Recuperación

bash
git reflog
# Encuentra hash perdido
git branch rescue <hash>

Buenas Prácticas

  • reset --hard solo 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/x

Resumen

Elige según visibilidad: reset reescribe, revert narra, checkout observa o extrae. Usa la herramienta mínima necesaria.