git-reflog

El reflog es un log especial donde se incorporan commits cada vez que se hace un cambio de rama o un reset, lo que puede ser usado en caso de emergencia para recuperar un estado anterior de la rama si la liamos con el rebase, reset o checkout.

En nuestro día a día con Git, tarde o temprano puede suceder que perdamos commits valiosos por un error al ejecutar algún comando. Por ejemplo, después de horas de trabajo corrigiendo un bug, un mal uso de git branch -D o un reset puede hacer que parezca que hemos perdido todo ese esfuerzo. Sin embargo, Git cuenta con una herramienta muy útil llamada reflog que nos ayuda a minimizar este tipo de dramas.

El reflog es un registro especial donde Git guarda una copia de seguridad de todos los movimientos del HEAD, es decir, de todos los cambios en el punto en el que estamos trabajando. Cada vez que hacemos un checkout, un reset o cualquier operación que cambie la referencia del HEAD, Git almacena el estado anterior en el reflog. Esto significa que aunque borremos una rama o perdamos un commit, Git mantiene un historial oculto con los hashes de esos commits que han pasado por nuestro repositorio.

Imaginemos que hemos creado una rama llamada rama-b para trabajar en la corrección de un bug importante. Después de varias horas, hacemos un commit con el mensaje corrige un bug bastante feo. Por alguna urgencia, cambiamos a la rama principal y, sin darnos cuenta, borramos rama-b con git branch -D rama-b. En ese momento, parece que hemos perdido todo el trabajo realizado en esa rama. Pero si consultamos el reflog, veremos que Git ha guardado el hash del último commit de rama-b antes de borrarla.

Para inspeccionar el reflog, podemos usar el comando:

git reflog

Este comando nos muestra una lista con todos los estados por los que ha pasado el HEAD, incluyendo cambios de ramas, resets y checkouts. Cada entrada incluye el hash del commit y un mensaje que explica por qué se guardó esa referencia. Así, podemos localizar el commit perdido y examinar su contenido con:

git show <hash_del_commit>

Si queremos recuperar ese commit y volver a tener la rama que habíamos borrado, podemos crear una nueva rama apuntando a ese commit:

git branch rama-b <hash_del_commit>
git switch rama-b

De esta forma, recuperamos el trabajo perdido y podemos seguir trabajando como si nada hubiera pasado.

Es interesante saber que git reflog no es un comando independiente, sino un alias para git log con opciones especiales. Por ejemplo, podemos obtener la misma información con:

git log -g

Y si queremos ver los cambios en detalle, incluyendo los diffs de cada commit en el reflog, podemos usar:

git log -p -g

Esto nos permite inspeccionar cómodamente cada modificación que hemos realizado y que Git ha registrado en el reflog.

Además, algunos comandos específicos generan entradas en el reflog. Por ejemplo, git switch (que es una alternativa moderna a git checkout para cambiar de rama) y sus variantes como git switch -c para crear una rama nueva, o git switch -C que fuerza la creación de una rama, incluso si ya existía, sobrescribiéndola. Este último es especialmente peligroso porque puede hacer que perdamos trabajo si no tenemos cuidado, pero gracias al reflog, siempre podemos intentar recuperarlo.

En definitiva, el reflog es una herramienta fundamental para evitar pérdidas irreversibles en nuestro trabajo con Git. Nos ofrece una especie de copia de seguridad interna que registra todos los movimientos del HEAD, permitiéndonos volver atrás y rescatar commits que parecían perdidos. Por eso, cuando nos enfrentemos a la desaparición inesperada de ramas o commits, lo primero que debemos hacer es consultar el reflog para buscar y recuperar nuestro trabajo.

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