El fantasma de Git se compromete a eludir el logging

Hoy estaba trabajando en uno de mis proyectos y me di count de algunas rarezas con git. Git te permitiría comprometer tu trabajo con una twig fantasma. Utilizo el término " twig fantasma" porque los cambios existen en algún lugar del tree, pero elude git log --graph --decorate --oneline --all . ¿Alguien puede explicarme por qué es esto?

Pasos para reproducir este comportamiento

Ingrese el estado principal separado (puede getlo ejecutando git checkout <hash> ).

 # Not currently on any branch. # Untracked files: # (use "git add <file>..." to include in what will be committed) # # uml 1.pdf 

Realice algunos cambios en su base de código. Y verifique el estado del directory de trabajo usando el git status . Esto debería enumerar los cambios, pero declara que no estás en ninguna twig.

 # Not currently on any branch. # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: .gitignore # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # uml 1.pdf 

Confirme los cambios usando git commit -am '<message>'

 [detached HEAD ded7725] updated .gitignore 1 files changed, 8 insertions(+), 1 deletions(-) 

Si luego realiza una extracción de una twig conocida, "maestro", por ejemplo, todos los cambios cometidos en el estado de cabecera separada desaparecen. Esto es esperado.

Runnig git log --graph --decorate --oneline --all mostrará todos los commits excepto el cometido en el head separado ( ded7725 en mi caso).

Sin embargo, una git checkout <hash-for-ghost-branch> devuelve los cambios confirmados en la twig fantasma. El problema es que uno no puede recordar este hash para siempre.

El comportamiento esperado sería que esta twig fantasma estará en el logging del gráfico en una hoja algo colgante. Pero no está presente. Se agradece cualquier explicación sobre por qué sucede esto. O tal vez me estoy perdiendo una bandera para mostrar twigs ocultas …

El motivo principal por el que esta twig "fantasma" no aparece en su logging de git –all es que este logging solo representará todas las twigs, no todas las confirmaciones existentes. Debes tener en count que cuando refunda las confirmaciones, no elimina las confirmaciones anteriores, solo las copy a otro padre, por lo que también se comprometen sin ninguna twig, como su twig fantasma.

commits son como objects referencedos por otros objects, los únicos objects guardados por git son los referencedos por branches. Es realmente como una memory recolectada basura, su confirmación es un object que usted creó en memory sin referencerlo. Si ejecuta git gc git eliminará todas estas confirmaciones a las que no hace reference ninguna twig, incluida su "twig fantasma".

La solución para usted es mantener una reference a este compromiso, ya sea mediante la creación de una twig según lo explicado por wasworld, o mediante el labeldo de su tag de commit git tag tagname sha1 .

EDITAR: git gc no eliminará confirmaciones recientes, de acuerdo con su página de manual:

 The optional configuration variable gc.reflogExpire can be set to indicate how long historical entries within each branch's reflog should remain available in this repository. The setting is expressed as a length of time, for example 90 days or 3 months. It defaults to 90 days. 

Por lo tanto, su sucursal fantasma estará a salvo de git gc (que se puede iniciar sin que usted lo solicite) durante 90 días de forma pnetworkingeterminada.

La twig "fantasma", como la llamas, no es una twig. Son compromisos en el DAG que no apuntan a nada.

Aunque no he visto el código, me imagino que git log dibuja el gráfico y enumera las confirmaciones comenzando en los pointers de las twigs y trabajando hacia atrás. Como tus commits en un estado HEAD aislado no tienen nada que los señale, no hay forma de que git log "los vea".

Para solucionarlo, simplemente cree una twig con la git branch branch_name <commit> . Entonces, git log tendrá algo que apunte al último commit hecho en el estado HEAD separado y "encontrará" esos commits cuando muestre el log / dibujo del gráfico.

En las twigs de git son solo indicadores para commits. Entonces, cuando dices "El problema es que uno no puede recordar este hash para siempre", ¿por qué no simplemente crear una twig en él?

 git branch branch_name <commit> 

Lo que también hay que tener en count es que si no creas ninguna twig que apunte a esta confirmación, se convertirá en gc una vez que pase el time de expiración. El valor pnetworkingeterminado es 90 días.