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

158

La página de manual dice que log muestra los registros de confirmación y reflog gestiona la información de reflog. ¿Qué es exactamente la información de registro y qué tiene que no tenga el registro? El registro parece mucho más detallado.

Noich
fuente

Respuestas:

221

git logmuestra la CABEZA actual y su ascendencia. Es decir, imprime los puntos de confirmación HEAD, luego su padre, su padre, etc. Atraviesa los ancestros del repositorio, buscando 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 reflogno 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 para su repositorio. El reflog no es parte del repositorio en sí (se almacena por separado para los commits mismos) y no se incluye en empujes, recuperaciones o clones; Es puramente local.

Aparte: comprender el reflog significa que realmente no puede perder datos de su repositorio una vez que se ha confirmado. Si accidentalmente restablece una confirmación anterior, o vuelve a emitir incorrectamente, o cualquier otra operación que visualmente "elimine" las confirmaciones, puede usar el registro de nuevo para ver dónde estaba antes y git reset --hardvolver a esa referencia para restaurar su estado anterior. Recuerde, los árbitros implican no solo el commit sino toda la historia detrás de él.

ben_h
fuente
26
Una advertencia: a veces PUEDES perder datos porque las entradas de registro no persisten eternamente; se eliminan bajo ciertas condiciones. Vea esta respuesta y los documentos para git-reflog y git-gc . En general, si la operación destructiva no fue hace más de 2 semanas, lo más probable es que esté a salvo.
mcmlxxxvi
@mcmlxxxvi Tengo dos carpetas locales para el mismo repositorio, ¿puedo fusionar los registros de las dos carpetas?
Tmx
@ TMX, no entiendo muy bien su caso: ¿qué quiere decir con dos carpetas locales para el mismo repositorio ? Si tiene dos clones del mismo repositorio, que están actualizados, y desea "fusionar" su historial de edición, las .git/logs/refs/<branch>entradas tienen el formato <old_rev> <new_rev> [...] <timestamp> [...]. Puede intentar concatenar y ordenar por marca de tiempo. Sin embargo, algunas líneas new_revpueden no coincidir con la siguiente old_rev, en cuyo caso sospecho que el registro no será válido. Entonces podría intentar insertar entradas falsas para "arreglar" la secuencia, pero me parece demasiado complicado.
mcmlxxxvi
62
  • git log muestra el registro de confirmación accesible desde las referencias (cabezas, etiquetas, controles remotos)
  • git reflog es un registro de todas las confirmaciones a las que se hace referencia en su repositorio en cualquier momento.

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

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflogexpire elimina las entradas de registro anteriores a esta vez; el valor predeterminado es 90 días.
Con " <pattern>" (por ejemplo, " refs/stash") en el medio, la configuración se aplica solo a las referencias que coinciden con <pattern>.

red de seguridad

git refloges a menudo referencia como " su red de seguridad "

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

" Mantener la calma y usargit reflog "

mantenga la calma

Nuevamente, reflog es una grabación local de su SHA1.
A diferencia de git log: si empuja su repositorio a un repositorio ascendente , verá lo mismo git log, pero no necesariamente lo mismo git reflog.

VonC
fuente
14

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

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

Puede ver su 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 su punta de sucursal se actualiza por cualquier motivo, Git almacena esa información para usted en este historial temporal. Y también puede especificar confirmaciones anteriores con estos datos.

El reflogcomando también se puede utilizar para eliminar entradas o caducar entradas del registro que son demasiado antiguas. De la documentación oficial de Linux Kernel Git parareflog :

El subcomando expirese usa para podar las entradas de reflog más antiguas.

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

Comunidad
fuente
Pero, ¿no le git logproporciona la misma información? Lo siento si parece obvio, soy muy nuevo en GIT y me gustaría obtener algunos conceptos básicos justo antes de mi primer OMG.
Noich
2
Git log es un registro de tus confirmaciones . El reflog, como dice el libro Pro Git, es un registro de sus referencias (básicamente, sus punteros de rama y su HEADpuntero), y a qué compromisos han estado apuntando. ¿Tiene sentido? En una nota al margen, logtambién puede mostrarle información de registro, pero debe pasar un indicador de opción especial como argumento para ello --walk-reflogs.
3
Además, como eres un principiante en Git, te recomiendo que leas el libro Pro Git, así es como aprendí la mayor parte de lo que aprendí sobre Git. Recomiendo los capítulos 1-3 y 6-6.5. También recomiendo encarecidamente que aprenda a cambiar la base de forma interactiva y no interactiva.
8

También tenía curiosidad sobre esto y solo quiero elaborar y resumir un poco:

  1. git logmuestra un historial de todos tus commits para la rama en la que estás. Pague una rama diferente y verá un historial de confirmación diferente. Si desea ver su historial de confirmación para todas las ramas, escriba git log --all.

  2. git reflogmuestra un registro de tus referencias como dijo Cupcake. Hay una entrada cada vez que se realiza una confirmación o un pago. Intente alternar entre dos ramas varias veces utilizando git checkouty ejecutar git reflogdespués de cada pago. Verá que la entrada superior se actualiza cada vez como una entrada de "pago". No ve este tipo de entradas en git log.

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

mitch
fuente
1

Me gusta pensar que la diferencia entre git log y reflog es la diferencia entre un registro privado y un registro público.

Privado vs público

Con el git reflog, realiza un seguimiento de todo lo que ha hecho localmente. ¿Te comprometiste? El registro lo sigue. ¿Hiciste un restablecimiento completo? El registro lo sigue. ¿ Modificó una confirmación? ? El registro lo sigue. Todo lo que has hecho localmente, hay una entrada en el reflog.

Esto no es cierto para el registro. Si modifica una confirmación, el registro solo muestra la nueva confirmación. Si reinicia y omite algunas confirmaciones en su historial, las confirmaciones que omitió no aparecerán en el registro. Cuando envías tus cambios a otro desarrollador o a GitHub o algo así, solo aparecerá el contenido rastreado en el registro. Para otro desarrollador, parecerá que los reinicios nunca ocurrieron o las reparaciones nunca sucedieron.

El registro está pulido. El reflog es lapidario.

Entonces sí, me gusta la analogía 'privado vs público'. O tal vez un mejor registro vs reflog analogía es 'pulido vs lapidario'. El reflog muestra todas sus pruebas y errores. El registro solo muestra una versión limpia y pulida de su historial de trabajo.

Echa un vistazo a esta imagen para enfatizar el punto. Se han producido una serie de enmiendas y restablecimientos desde que se inicializó el repositorio. El reflog lo muestra todo. Sin embargo, el comando de registro hace que parezca que solo ha habido una confirmación contra el repositorio:

El registro está pulido.  El registro es lapidario.

Volver a la idea de la "red de seguridad"

Además, dado que el registro de registro realiza un seguimiento de las cosas que modificó y confirma que restablece , le permite volver y encontrar esas confirmaciones porque le dará los identificadores de confirmación. Asumiendo que su repositorio no ha sido purgado de las confirmaciones antiguas, eso le permite resucitar elementos que ya no están visibles en el registro. Así es como el reflog a veces termina salvando la piel de alguien cuando necesita recuperar algo que pensó que perdió inadvertidamente.

Cameron McKenzie
fuente
-6

En realidad, reflog es un alias para

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

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

usuario10028634
fuente
9
En git log, -ges la forma abreviada de --walk-reflogs. Entonces, eso no explica nada.
Adrian W