Saltar al contenido

git reflog

Definición

El comando git reflog registra las actualizaciones realizadas en las referencias locales, como ramas, HEAD y stashes. Te permite volver a commits, incluidos aquellos que no están referenciados por ninguna rama o etiqueta. Después de reescribir el historial, el reflog incluye información sobre el estado anterior de las referencias y hace posible volver a ese estado si es necesario.

git reflog

Hay varios comandos de git que aceptan un parámetro de referencia (un "ref") para apuntar a un commit específico. El mecanismo de reflog mantiene un registro del historial de actualizaciones de estas refs en el repositorio local.

Uso básico del comando git reflog

En general, git reflog se usa así:

git reflog

bash
git reflog

Es un atajo para esto:

git reflog show HEAD

bash
git reflog show HEAD

El comando anterior muestra el reflog de HEAD. La salida se ve como la siguiente:

git reflog command

bash
a32556a HEAD@{0}: commit: migrating content
ab371fd HEAD@{1}: commit: adding git reflog outline
23a491a HEAD@{2}: checkout: moving from stage to feature/solver
7b119cb HEAD@{3}: checkout: moving from feature/solver to stage
56a183a HEAD@{4}: commit: changing color scheme
7a2aa71 HEAD@{5}: commit: adding more color palettes
a56322b HEAD@{6}: commit: adding color tool package

Referencias del reflog

De forma predeterminada, git reflog muestra el reflog de la referencia HEAD, que apunta a la rama actualmente activa. Puedes acceder a una ref de git usando la sintaxis name@{qualifier}.

Ejecuta el siguiente comando para obtener el reflog completo de todas las referencias:

git reflog show --all

bash
git reflog show --all

Pasa el nombre de la rama actual a git reflog show si quieres ver su reflog. En el ejemplo siguiente, mostramos el reflog de la rama test_branch.

git reflog show branch

bash
git reflog show test_branch
#32a591f test_branch@{0}: commit: add snippets
#23bae4a test_branch@{1}: commit (initial): initial commit

Usar el siguiente comando mostrará el reflog de un git stash::

git reflog stash

bash
git reflog stash
#0d44de3 stash@{0}: WIP on git_reflog: a567574 adding Vue.js

Reflogs con tiempo

Cada entrada del reflog tiene una marca de tiempo asociada. Pueden usarse como calificadores en la sintaxis de puntero de ref de Git, lo que te permite filtrar los reflogs de Git por tiempo. Aquí tienes algunos ejemplos de calificadores de tiempo:

  • 1.minute.ago
  • 1.hour.ago
  • 1.day.ago
  • yesterday
  • 1.week.ago
  • 1.month.ago
  • 1.year.ago
  • 2011-05-17.09:00:00

También puedes combinar calificadores de tiempo (por ejemplo, 1.week.3.hours.ago) y usar formas plurales (por ejemplo, 5.hours.ago). Las refs con calificadores de tiempo pueden pasarse a otros comandos de git, así:

timed reflogs

bash
git diff master@{0} master@{1.week.ago}

Este comando muestra un diff de la rama master actual frente a master de hace 1 semana.

Subcomandos de git reflog

Git reflog acepta varios argumentos que actúan como subcomandos. Se describen a continuación.

Mostrar - subcomando git reflog show

El subcomando git reflog show es un alias de git log -g --abbrev-commit --pretty=oneline. Es el comportamiento predeterminado. En el siguiente ejemplo, ambos comandos son equivalentes:

git reflog show equivalence

bash
git reflog master@{0}
git reflog show master@{0}

Expirar - subcomando git reflog expire

El subcomando git reflog expire se usa para limpiar entradas antiguas o inalcanzables del reflog. Debido al riesgo de pérdida de datos, este subcomando normalmente no lo usan directamente los usuarios; Git lo utiliza internamente. De forma predeterminada, las entradas del reflog expiran después de 90 días. Puedes especificar un tiempo de expiración personalizado usando el argumento --expire:

git reflog expire example

bash
git reflog expire --expire=1.day.ago

Eliminar - subcomando git reflog delete

El subcomando git reflog delete está diseñado para eliminar entradas específicas del reflog. Los usuarios finales generalmente evitan este comando debido al riesgo de pérdida de datos, de forma similar a git reflog expire. Para eliminar una entrada específica, puedes pasar su referencia:

git reflog delete example

bash
git reflog delete HEAD@{1}

Recuperar commits perdidos

Los commits nunca se pierden realmente en Git, incluso durante operaciones de reescritura del historial. Veamos un ejemplo de git log --pretty=oneline que se ve así:

Recovering lost commits

bash
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commit

Ahora supongamos que hacemos algunos cambios nuevos en este repositorio y ejecutamos lo siguiente:

the git reflog command

bash
#make changes to HEAD
git commit -am "API changes"

Como resultado, el log ahora se ve así:

git reflog definition

bash
37656e19d4e4f1a9b419f57850c8f1974f871b07 API changes
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commit

En esta etapa, para hacer un rebase interactivo contra la rama master, necesitamos ejecutar lo siguiente:

git reflog example

bash
git rebase -i origin/master

Mientras se hace rebase, el subcomando s de rebase marca commits para combinarlos en el commit más reciente "API changes". Como resultado de combinar los commits, la salida de git log ahora se ve así:

git reflog usage

bash
40d8a1237656e19d4e4f1a9b419f57850c8f1974 API changes
35aee4a4404c42128bee8468a9517418ed0eb3dc initial commit

Ahora parece que los commits combinados han desaparecido. Si necesitas trabajar con un commit combinado, puedes aprovechar el reflog.

git reflog description

bash
git reflog
37656e1 HEAD@{0}: rebase -i (finish): returning to refs/heads/git_reflog
37656e1 HEAD@{1}: rebase -i (start): checkout origin/master
37656e1 HEAD@{2}: commit: API changes

Hay entradas del reflog para el inicio y el final del rebase, y antes de ellas está el commit "API changes". La referencia del reflog puede pasarse a git reset para restablecer a un commit anterior al rebase.

git reset HEAD

bash
git reset HEAD@{2}

Este comando moverá HEAD a ese commit con "API changes" y restaurará los otros commits combinados.

Práctica

What are the correct statements about the `git reflog` command as described in the W3Docs Git Tutorial?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.