¿Cuál es la diferencia entre git reflog y log?

La página man dice que el logging muestra los loggings de commit y que el reflog gestiona la información de reflog. ¿Qué es exactamente la información de reflog y qué tiene que el log no tiene? El logging parece mucho más detallado.

git log muestra el HEAD actual y su ascendencia. Es decir, imprime los puntos HEAD de confirmación, luego su padre, su padre, y así sucesivamente. Atraviesa la ascendencia del repository, al search recursivamente el padre de cada commit.

(En la práctica, algunos commits tienen más de un padre. Para ver un logging más representativo, use un command como git log --oneline --graph --decorate ).

git reflog no atraviesa en absoluto el ancestro de HEAD. El reflog es una list orderada de los commits que HEAD ha señalado: es el historial de deshacer de su repository. El reflog no es parte del repository en sí mismo (se almacena por separado en los commits) y no está incluido en push, fetches o clones; es puramente local.

Aparte: entender el reflog significa que no se pueden perder los datos de su repository una vez que se haya comprometido. Si accidentalmente restableces una confirmación más antigua, o la rebase incorrectamente, o cualquier otra operación que "remueva" visualmente las confirmaciones, puedes usar el reflog para ver dónde estabas antes y git reset --hard a ese ref para restaurar tu estado anterior . Recuerde, las references implican no solo el compromiso sino toda la historia detrás de él.

  • git log muestra el logging de confirmación accesible desde los refs (encabezados, tags, controles remotos)
  • git reflog es un logging de todas las confirmaciones que son o fueron referencedas en su repository en cualquier momento.

Es por eso que git reflog (una grabación local que se poda después de 90 días por defecto) se usa cuando se realiza una operación "destructiva" (como eliminar una twig), para recuperar el SHA1 al que se refirió esa twig.
Ver git config :

 gc.reflogexpire gc.<pattern>.reflogexpire 

git reflog expire quita las inputs de reflog anteriores a esta vez; pnetworkingeterminado a 90 días.
Con " <pattern> " (por ejemplo, " refs/stash ") en el medio, la configuration se aplica solo a los refs que coinciden con el <pattern> .

red de seguridad

git reflog es a menudo reference como " su networking de security "

En caso de problemas, el consejo general, cuando git log no le muestra lo que está buscando, es:

" Mantén la calma y usa git reflog "

mantenga la calma

Nuevamente, el reflog es una grabación local de su SHA1.
A diferencia git log : si envía su repository a un repository en sentido ascendente , verá el mismo git log , pero no necesariamente el mismo git reflog .

Aquí está la explicación del reflog del libro Pro Git :

Una de las cosas que hace Git en segundo plano mientras trabajas es mantener un reflog, un logging de dónde han estado tus references de HEAD y de sucursal durante los últimos meses.

Puedes ver tu reflog usando git reflog :

 $ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD 

Cada vez que se actualice su sugerencia de sucursal por algún motivo, Git almacena esa información en este historial temporal. Y también puedes especificar confirmaciones más antiguas con estos datos.

El command de reflog también se puede usar para eliminar inputs o caducar inputs del reflog que son demasiado antiguas. De la documentation oficial de Linux Kernel Git para el reflog :

El expire subcommand se utiliza para eliminar inputs de reflog anteriores.

Para eliminar inputs individuales del reflog, utilice el subcommand delete y especifique la input exacta (por ejemplo, git reflog delete master@{2} ).

Tenía curiosidad acerca de esto también y solo quiero elaborar y resumir un poco:

  1. git log muestra un historial de todas tus confirmaciones para la sucursal en la que te encuentras. Verifica una sucursal diferente y verás un historial de confirmaciones diferente. Si desea ver que confirme el historial de todas las twigs, escriba git log --all .

  2. git reflog muestra un logging de tus references como dijo Cupcake. Hay una input cada vez que se realiza un commit o un checkout. Intente alternar entre dos twigs varias veces usando el git checkout y ejecute git reflog después de cada pago. Verás que la input superior se actualiza cada vez como una input de "pago". No ve este tipo de inputs en el git log .

Referencias: http://www.lornajane.net/posts/2014/git-log-all-branches