¿Qué es un commit colgante y un blob en un repositorio Git y de dónde vienen?

Resuelto doub1ejack asked hace 11 años • 5 respuestas

Estoy buscando información básica sobre confirmaciones colgantes y blobs.

Mi repositorio parece estar bien. Pero corrí git fsckpor primera vez para ver qué hacía y tengo una larga lista de "blobs colgantes" y un único "compromiso colgante".

¿Qué son estas cosas? ¿De dónde vienen ellos? ¿Indican algo inusual (bueno o malo) sobre el estado de mi repositorio?

doub1ejack avatar Aug 29 '13 22:08 doub1ejack
Aceptado

Durante el proceso de trabajo con su repositorio de Git, puede terminar dando marcha atrás en las operaciones y realizando otros movimientos que causen blobs intermediarios, e incluso algunas cosas que Git hace por usted para ayudarlo a evitar la pérdida de información.

Eventualmente (condicionalmente, según la página de manual de git gc ) realizará la recolección de basura y limpiará estas cosas. También puedes forzarlo invocando el proceso de recolección de basura git gc.

Para obtener más información sobre esto, consulte Mantenimiento y recuperación de datos en el sitio git-scm.

Una ejecución manual de GC dejará de forma predeterminada dos semanas antes del tiempo de ejecución de este comando como red de seguridad. De hecho, se recomienda ejecutar el GC ocasionalmente para ayudar a garantizar un uso eficaz de su repositorio Git. Sin embargo, como todo, debes comprender lo que está haciendo antes de destruir aquellas cosas que pueden ser importantes para ti.

vgoff avatar Aug 29 '2013 15:08 vgoff

Blob colgante = Un cambio que llegó al área/índice de preparación, pero que nunca se confirmó. Una cosa que es sorprendente con Git es que una vez que se agrega al área de preparación, siempre puedes recuperarlo porque estos blobs se comportan como confirmaciones en el sentido de que también tienen un hash.

Confirmación pendiente = Una confirmación a la que no está directamente vinculada ninguna confirmación secundaria, rama, etiqueta u otra referencia. ¡Tú también puedes recuperarlos!

Elijah Lynn avatar Mar 06 '2014 13:03 Elijah Lynn

CÓMO eliminar todas las confirmaciones pendientes de su repositorio Git desde https://web.archive.org/web/20210116144915/https://tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git- repositorio/ :

git reflog expire --expire=now --all
git gc --prune=now

Asegúrate de que realmente deseas eliminarlos, ya que podrías decidir que, después de todo, los necesitas.

qxo avatar Oct 28 '2016 11:10 qxo

Una confirmación pendiente es una confirmación que no está asociada con una referencia, es decir, no hay forma de alcanzarla.

Por ejemplo, considere el siguiente diagrama. Supongamos que eliminamos la rama featureX sin fusionar sus cambios, entonces la confirmación D se convertirá en una confirmación pendiente porque no hay ninguna referencia asociada a ella. Si se hubiera fusionado con master, entonces las referencias HEAD y master habrían apuntado a confirmar D y ya no estaría colgando, incluso si elimináramos featureX. Lea la nota después del diagrama para comprender esto mejor.

Git recolecta automáticamente la basura, es decir, elimina las confirmaciones pendientes. Podemos usar git reflogpara recuperar una rama (de confirmaciones pendientes) que se eliminó sin fusionarla. Podemos recuperar confirmaciones eliminadas solo si están presentes en el almacén de objetos local. Si se recogió basura, entonces no podremos recuperarla.

ingrese la descripción de la imagen aquí

TENGA EN CUENTA que el nombre de una rama, es decir, una etiqueta de rama, es en realidad una referencia a la última confirmación de una rama o al final de la rama. En el diagrama anterior, featureX, master y HEAD son solo referencias a confirmaciones específicas. featureX y las etiquetas maestras se refieren a las últimas confirmaciones en sus respectivas ramas. HEAD generalmente se refiere a la punta de la rama actualmente desprotegida (maestra en este caso). Si verifica una confirmación anterior en su rama actual, entonces HEAD estará en un estado separado, es decir, apuntará a la confirmación anterior en lugar de a la más reciente. También tenga en cuenta que HEAD se denomina referencia simbólica porque en realidad apunta a la etiqueta de la rama actual y cualquier etiqueta de la rama siempre apunta a la punta de la rama. Entonces, en circunstancias normales, HEAD apunta indirectamente al último compromiso.

Además, tenga en cuenta que Git representa su gráfico/historial de confirmación como un gráfico acíclico dirigido . Cada confirmación tiene una referencia a su padre. Por lo tanto, las flechas en un diagrama de confirmación apuntan desde la confirmación secundaria a la confirmación principal. Necesitamos una referencia al último compromiso secundario para poder llegar a los compromisos más antiguos en una rama.

PD : El diagrama y la comprensión anteriores se obtuvieron de este curso gratuito . Aunque el curso es bastante antiguo, los conocimientos siguen siendo relevantes.

MasterJoe avatar Jan 21 '2020 23:01 MasterJoe