¿Qué es un commit colgante y un blob en un repositorio Git y de dónde vienen?
Estoy buscando información básica sobre confirmaciones colgantes y blobs.
Mi repositorio parece estar bien. Pero corrí git fsck
por 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?
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.
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!
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.
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 reflog
para 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.
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.