Git: ¿qué es un commit / blob colgante y de dónde vienen?

149

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

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 solo 'commit colgado'.

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

Duda1
fuente

Respuestas:

96

Durante el trabajo con su repositorio git, puede terminar retrocediendo de las operaciones y haciendo otros movimientos que causen manchas intermedias, e incluso algunas cosas que git hace por usted para ayudar a evitar la pérdida de información.

Eventualmente (condicionalmente, de acuerdo con la página de manual de git gc ) realizará la recolección de basura y limpiará estas cosas. También se puede forzar al invocar el proceso de recolección de basura, git gc.

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

Una ejecución manual de GC saldrá por defecto 2 semanas antes del tiempo de ejecución de este comando de una red de seguridad. De hecho, se recomienda ejecutar el GC ocasionalmente para ayudar a garantizar el uso eficaz de su repositorio git. Sin embargo, como todo, debes entender lo que está haciendo antes de destruir las cosas que pueden ser importantes para ti.

vgoff
fuente
10
Por lo tanto, es justo decir que 1) a menos que piense que hay algún problema con mi repositorio, es seguro eliminarlos git gc, y 2) no necesito preocuparme por esto porque estos bits colgantes son normales y ya están bien manejarlos?
doub1ejack
77
Esa sería una evaluación justa.
vgoff
9
Además, cada vez que 'agregue' un archivo, pero no confirme esa versión exacta del archivo, terminará con un blob colgante. Nada de qué preocuparse.
canton7
77
oub1ejack: en términos generales, no debería ejecutar la recolección de basura manualmente. Es un mal hábito entrar y git hace la recolección de basura cuando sea necesario de todos modos. La desventaja de ejecutarlo manualmente es que perdió la capacidad de recuperar blobs colgantes y confirmaciones que puede que no desee ahora pero tal vez desee en el futuro. Una vez que ejecutas la recolección de basura, eliminas algunas funciones de reversión bastante poderosas de git. Use con precaución y como excepción, no la regla. --- Solo deja que git haga lo suyo.
Elijah Lynn
96

Bloque colgante = Un cambio que llegó al área / índice de preparación pero que nunca se comprometió. ¡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 commits ya que también tienen un hash!

Dangling commit = Una confirmación a la que no se vincula directamente ninguna confirmación secundaria, rama, etiqueta u otra referencia. ¡Puedes recuperarlos también!

Elijah Lynn
fuente
55
¿Deberían los "antepasados" leer "descendientes"? En general, no puede llegar a ningún git commit a través de sus antepasados.
Phil Miller
@Novelocrat Tenía el mismo pensamiento, estoy de acuerdo en que probablemente debería leer descendientes.
stkent
1
Todavía leo "ascendientes" en tu respuesta. Parece que su edición del 2 de julio no corrigió el error tipográfico.
iclman
¿Cómo recuperas una gota que cuelga?
Hola
1
@ElijahLynn Tienes razón. Creo que leí demasiado rápido las discusiones. Una confirmación pendiente no tiene ningún descendiente / hijo y no está referenciada por una etiqueta o rama.
iclman
44

CÓMO eliminar todas las confirmaciones colgantes de su repositorio git de http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

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

Asegúrese de que realmente desea eliminarlos, ya que podría decidir que los necesita después de todo.

qxo
fuente
55
En realidad, la mayoría de los usuarios nunca deberían necesitar esto y si lo hacen probablemente sea para un caso de uso programático. El espacio en disco ahorrado o la velocidad aumentada al eliminar las confirmaciones pendientes no merecen el esfuerzo en mi opinión.
Elijah Lynn
1
Esto responde a una pregunta diferente.
Elijah Lynn el
6

Un commit colgante es un commit que no está asociado con la referencia, es decir, no hay forma de alcanzarlo.

Por ejemplo, considere el siguiente diagrama. Supongamos que eliminamos la rama branchX sin fusionar sus cambios, luego commit D se convertirá en un commit colgante porque no hay ninguna referencia asociada con él. Si se hubiera fusionado en maestro, las referencias HEAD y maestra habrían apuntado a confirmar D y ya no estaría colgando, incluso si eliminamos la función X. Lea la nota después del diagrama para comprender esto mejor.

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

ingrese la descripción de la imagen aquí

Tenga en cuenta que el nombre de una rama, es decir, la etiqueta de la rama, en realidad es una referencia a la última confirmación de una rama, es decir, la punta de la rama. En el diagrama anterior, featureX, master y HEAD son solo referencias a confirmaciones específicas. Las etiquetas featureX y master se refieren a los últimos commits en sus respectivas sucursales. HEAD generalmente se refiere a la punta de la rama actualmente desprotegida (maestro en este caso). Si comprueba una confirmación anterior en su rama actual, HEAD estará en un estado separado, es decir, señalará la confirmación anterior en lugar de la última. También tenga en cuenta que HEAD se denomina referencia simbólica porque en realidad apunta a la etiqueta de rama actual y cualquier etiqueta de rama siempre apunta a la punta de la rama. Entonces, en circunstancias normales, HEAD señala indirectamente a la última confirmación.

Como comentario adicional, tenga en cuenta que Git representa su gráfico / historial de compromiso como un gráfico acíclico dirigido . Cada confirmación tiene una referencia a él padre. Por lo tanto, las flechas en un diagrama de confirmación apuntan desde la confirmación secundaria a la confirmación primaria. Necesitamos una referencia a la última confirmación secundaria para llegar a las confirmaciones anteriores en una rama.

PD : el diagrama y la comprensión anteriores se obtuvieron de este curso gratuito . Aunque el curso es bastante antiguo, el conocimiento sigue siendo relevante.

MasterJoe2
fuente