Capítulo 2 de 2 · Git en equipo

Deshacer sin pánico

reflog, revert, reset y stash. Cuál usar en cada situación y qué es lo único que de verdad no tiene vuelta atrás.

3 min de lecturaActualizado el 5 de septiembre de 2026

Lo primero que hay que saber es que en Git casi nada se pierde. Mientras un commit exista en tu repositorio local, hay una forma de volver a él, aunque tú ya no lo veas. Eso debería quitarte bastante presión antes de tocar nada.

Qué herramienta para cada caso

Situación Comando
Cambios sin commit que quieres apartar un rato git stash push -m "wip"
Deshacer el último commit, conservando los cambios git reset --soft HEAD~1
Revertir algo que ya está publicado git revert <sha>
Recuperar una rama que borraste git reflog + git branch <nombre> <sha>
Recuperar un fichero de otro commit git restore --source=<sha> ruta

revert y reset no son intercambiables

reset mueve el puntero de la rama a otro sitio, y por tanto reescribe la historia. revert crea un commit nuevo que deshace los cambios de otro, y la historia se queda como estaba. Los dos «deshacen», pero de formas muy distintas.

git revert a1b2c3d              # un commit
git revert a1b2c3d..f4e5d6c     # un rango
git revert -m 1 <sha-del-merge> # deshacer un merge, manteniendo el primer padre

reflog, tu red de seguridad

reflog guarda cada movimiento de HEAD durante 90 días por defecto. Incluidos los movimientos que en teoría «perdieron» commits. Es la razón por la que casi nada se pierde.

  1. Mira por dónde has pasado:

    git reflog
    f4e5d6c HEAD@{0}: reset: moving to HEAD~3
    a1b2c3d HEAD@{1}: commit: Añade validación de importes
    9f8e7d6 HEAD@{2}: commit: Extrae el cálculo a un módulo
  2. Recupera ese estado en una rama nueva, sin tocar la actual:

    git branch rescate a1b2c3d
  3. Comprueba que está todo lo que esperabas y fusiona, o haz cherry-pick solo de lo que necesites.

Que los conflictos duelan menos

Dos ajustes de configuración que cambian bastante la experiencia. El primero muestra en el conflicto también el antepasado común, y con eso suele quedar claro qué intentaba hacer cada lado:

git config --global merge.conflictstyle zdiff3

El segundo hace que Git recuerde cómo resolviste un conflicto para no volver a preguntarte lo mismo:

git config --global rerere.enabled true

Lo que sí se pierde de verdad

Solo hay tres cosas que no tienen vuelta atrás:

  • Cambios que nunca añadiste al índice y que sobrescribes con git checkout . o git restore .. Git nunca los vio, así que no puede recuperarlos.
  • Commits a los que ya no apunta nadie, después de que expire el reflog y pase el recolector de basura con git gc.
  • Un push --force que sobrescribe el remoto cuando nadie más tenía esos commits en local.

Todo lo demás se puede recuperar. Y antes de cualquier comando que te dé respeto, un git branch respaldo cuesta un segundo y te quita el miedo.