Respuestas:
git log
muestra 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 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 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 --hard
volver a esa referencia para restaurar su estado anterior. Recuerde, los árbitros implican no solo el commit sino toda la historia detrás de él.
.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_rev
pueden 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.
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 reflog
expire 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>
.
git reflog
es 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:
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
.
Aquí está la explicación del reflog
libro 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 reflog
comando 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
expire
se usa para podar las entradas de reflog más antiguas.Para eliminar entradas individuales del reflog, use el subcomando
delete
y especifique la entrada exacta (por ejemplogit reflog delete master@{2}
).
git log
proporciona 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.
HEAD
puntero), y a qué compromisos han estado apuntando. ¿Tiene sentido? En una nota al margen, log
también puede mostrarle información de registro, pero debe pasar un indicador de opción especial como argumento para ello --walk-reflogs
.
También tenía curiosidad sobre esto y solo quiero elaborar y resumir un poco:
git log
muestra 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
.
git reflog
muestra 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 checkout
y ejecutar git reflog
despué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
Me gusta pensar que la diferencia entre git log y reflog es la diferencia entre un registro privado y un registro 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.
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:
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.
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.
git log
, -g
es la forma abreviada de --walk-reflogs
. Entonces, eso no explica nada.