Cómo deshacer un commit con reset

Si lo que queremos deshacer es algo que ya hemos confirmado, podemos deshacer el commit de varias formas. Hoy nos centramos en el comando git reset.

Cuando trabajamos con Git, a veces necesitamos deshacer commits que ya hemos confirmado, especialmente cuando un cambio no deseado ha sido incluido en el historial del repositorio. Por ejemplo, imagina que hemos eliminado todo el contenido de una página web por error y ese cambio ya está en un commit confirmado. Aunque el estado del repositorio nos indique que está limpio, en realidad hemos perdido información importante y queremos volver a un estado anterior.

Para solucionar esto, podemos usar el comando git reset. Lo primero que debemos hacer es identificar el commit al que queremos regresar. Para ello, es muy útil ejecutar git log --oneline, que nos muestra una lista compacta con los hashes de los commits y sus mensajes, facilitando la selección del punto de retorno.

Supongamos que queremos volver al commit con hash f5f0388. Si ejecutamos:

git reset f5f0388

Git eliminará los commits posteriores a ese punto y dejará los cambios que esos commits contenían como modificaciones sin añadir al área de stage. Esto significa que el repositorio queda sucio, con cambios locales pendientes de ser añadidos o descartados. Podemos comprobarlo con git status y ver las diferencias con git diff.

Es importante tener en cuenta que git reset es un comando destructivo. Si trabajamos en un repositorio local, esto puede estar bien, pero si compartimos el repositorio con otras personas, eliminar commits que otros tienen puede causar conflictos importantes al sincronizar con el repositorio remoto.

Además, git reset tiene diferentes modos que controlan cómo se manejan los cambios locales y el área de stage al deshacer commits. Por defecto, el modo es mixed, que elimina los commits y deja los cambios sin añadir al stage.

Si queremos eliminar completamente los cambios locales y el área de stage, podemos usar el modo hard:

git reset --hard f5f0388

Con esta opción, Git mueve el puntero HEAD al commit indicado y descarta cualquier cambio local o en el stage, dejando el repositorio exactamente como estaba en ese commit. Esto es útil cuando queremos deshacernos de un cambio de forma definitiva.

Por otro lado, el modo soft es el opuesto al hard. Con:

git reset --soft f5f0388

Git elimina los commits posteriores, pero mantiene los cambios en el área de stage. Esto es especialmente útil si hemos cometido demasiados cambios en un solo commit y queremos dividirlos en varios commits más pequeños. Al mantener los cambios en el stage, podemos seleccionar qué archivos o partes queremos confirmar en cada nuevo commit.

En resumen, git reset nos permite deshacer commits confirmados y controlar qué hacer con los cambios locales y el área de stage, ya sea preservándolos, eliminándolos o dejándolos sin añadir. Sin embargo, debemos usarlo con precaución, especialmente en repositorios compartidos, para evitar problemas de sincronización con otros colaboradores.

Lista de reproducción
  1. 1
    ¿Qué es Git?
    4 minutos
  2. 2
    Cómo instalar Git
    9 minutos
  3. 3
    Creando tu primer commit
    9 minutos
  4. 4
    Qué es el staging area
    10 minutos
  5. 5
    Cómo deshacer modificaciones de archivos
    7 minutos
  6. 6
    Cómo deshacer un commit con reset
    7 minutos
  7. 7
    Cómo revertir un commit con revert
    7 minutos
  8. 8
    Introducción a las ramas
    6 minutos
  9. 9
    Cómo crear y modificar ramas
    6 minutos
  10. 10
    Commits bajo el workflow Feature Branch
    6 minutos
  11. 11
    Cómo fusionar ramas con merge
    6 minutos
  12. 12
    Fusiones conflictivas
    9 minutos
  13. 13
    Cómo construir alias
    7 minutos
  14. 14
    Más sobre conflictos
    9 minutos
  15. 15
    Etiquetas
    7 minutos
  16. 16
    Tags anotados
    9 minutos
  17. 17
    git stash: esconder cambios
    6 minutos
  18. 18
    Introducción a remotos
    5 minutos
  19. 19
    Pusheando a un remoto
    6 minutos
  20. 20
    Clonando y haciendo pull
    6 minutos
  21. 21
    Fetch y pull rebases
    8 minutos
  22. 22
    Rebase
    7 minutos
  23. 23
    Rebase interactivo
    6 minutos
  24. 24
    Master, main y otros nombres de rama
    9 minutos
  25. 25
    git switch
    9 minutos
  26. 26
    git-restore
    10 minutos
  27. 27
    git-grep
    11 minutos
  28. 28
    Gitignore
    11 minutos
  29. 29
    El flag --patch
    9 minutos
  30. 30
    git-apply y parches en bruto (advanced)
    9 minutos
  31. 31
    Merge octopus (advanced)
    9 minutos
  32. 32
    Conventional commits
    12 minutos
  33. 33
    Merge and squash (GitLab / GitHub...)
    6 minutos
  34. 34
    git merge --squash
    7 minutos
  35. 35
    git-bisect
    8 minutos
  36. 36
    git-blame
    6 minutos
  37. 37
    git-reflog
    10 minutos
  38. 38
    Git para la Bash
    11 minutos
  39. 39
    Submódulos (parte 1)
    7 minutos
  40. 40
    Submódulos (parte 2)
    10 minutos
  41. 41
    Otros clientes Git (último episodio)
    9 minutos