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


La página man dice que el registro muestra los registros 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 registro parece mucho más detallado.


107
2017-07-25 12:13


origen


Respuestas:


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 repositorio, al buscar recursivamente el padre de cada commit.

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

git reflog no atraviesa la ascendencia de HEAD en absoluto. El reflog es una lista ordenada de los commits que HEAD ha señalado: es el historial de deshacer de su repositorio. El reflog no es parte del repositorio 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 repositorio una vez que se haya comprometido. Si accidentalmente restablece a una confirmación anterior, o rebase incorrectamente, o cualquier otra operación que "remueve" visualmente las confirmaciones, puede usar el reflog para ver dónde estaba antes y git reset --hard de vuelta a ese ref para restaurar su estado anterior. Recuerde, las referencias implican no solo el compromiso sino toda la historia detrás de él.


140
2017-07-25 14:01



  • git log muestra el registro de confirmación accesible desde los refs (encabezados, etiquetas, controles remotos)
  • git reflog es un grabar de todas las confirmaciones que son o fueron referenciadas en su repositorio en cualquier momento.

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

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflog caducar elimina las entradas de reflog anteriores a esta vez; predeterminado a 90 días.
  Con "<pattern>" (p.ej. "refs/stash") en el medio, la configuración se aplica solo a los refs que coinciden con <pattern>.

safety net

git reflog a menudo es referencia como "tu red de seguridad"

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

"Mantenga la calma y use git reflog"

keep calm

Nuevamente, el reflog es una grabación local de su SHA1.
Opuesto a git log: si empuja su repositorio a un repo upstream, verás lo mismo git log, pero no necesariamente lo mismo git reflog.


37
2017-07-25 13:47



Aquí esta la explicación de reflog del libro Pro Git:

Una de las cosas que hace Git en segundo plano mientras trabajas es mantener un reflog, un registro de dónde han estado tus referencias 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.

los reflog El comando también se puede usar para eliminar entradas o caducar entradas del reflog que son demasiado antiguas. Desde el documentación oficial de Linux Kernel Git para reflog:

El subcomando expire se usa para eliminar entradas de reflog anteriores.

Para eliminar entradas individuales del reflog, use el subcomando delete y especifique la entrada exacta (p. git reflog delete master@{2})


8
2017-07-25 12:33



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

  1. git log muestra un historial de todas sus confirmaciones para la sucursal en la que se encuentra. Verifica una sucursal diferente y verás un historial de confirmaciones diferente. Si quieres ver que comprometes el historial de todas las ramas, escribe git log --all.

  2. git reflog muestra un registro de tus referencias como dijo Cupcake. Hay una entrada cada vez que se realiza un commit o un checkout. Intente alternar entre dos ramas varias veces usando git checkout y correr git reflog después de cada pago. Verás que la entrada superior se actualiza cada vez como una entrada de "pago". Usted no ve este tipo de entradas en git log.

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


1
2017-08-19 09:46



En realidad, el reflog es un alias para

 git log -g --abbrev-commit --pretty=oneline

entonces la respuesta debería ser: es un caso específico.


0
2017-07-03 19:26