tag publicar practices describe delete best git hash

publicar - git tags best practices



En Git, ¿cuál es la diferencia entre hashes largos y cortos? (4)

Aquí está el hash largo de Git:

commit c26cf8af130955c5c67cfea96f9532680b963628

Fusionar: 8654907 37c2a4f

Autor: nicolas

Fecha: miércoles 26 de abril 13:28:22 2017 -0400

Aquí está el corto:


El hash corto es solo una versión más corta del hash original (largo). El hash original de Git tiene una longitud de 40 bytes, mientras que el corto tiene solo 8 bytes. Sin embargo, se vuelve difícil administrarlo (en términos de uso de escritura o visualización), y es por eso que se usa la versión corta.

Este enfoque se utiliza en casi todos los proyectos en los que un hash es para integridad (distribución de paquetes), versiones (Git y SVN) o arquitectura en capas (Docker).


El hash corto muestra los primeros siete caracteres del hash. El hash corto de c26cf8af130955c5c67cfea96f9532680b963628 es c26cf8a en la segunda fila. Vea la documentación :

Git es lo suficientemente inteligente como para descubrir qué tipo de compromiso se supone que debe escribir si proporciona los primeros caracteres, siempre y cuando su SHA-1 parcial tenga al menos cuatro caracteres de largo e inequívoco.


Para elaborar un poco más sobre por qué el hash corto es útil, y por qué a menudo no se necesita el hash largo, tiene que ver con cómo Git almacena las cosas.

c26cf8af130955c5c67cfea96f9532680b963628 se almacenará en uno de dos lugares. Podría estar en el archivo .git/objects/c2/6cf8af130955c5c67cfea96f9532680b963628 . Tenga en cuenta que los dos primeros caracteres, c2 , forman un directorio y el resto es el nombre del archivo. Dado que muchos sistemas de archivos no funcionan bien cuando hay demasiados archivos en un directorio, esto evita que cualquier directorio tenga demasiados archivos y mantiene esta pequeña base de datos de directorios eficiente.

Con solo el hash corto, c26cf8a , git puede hacer el equivalente de .git/objects/c2/6cf8a* y es probable que sea un solo archivo. Dado que los objetos se subdividen en subdirectorios, no hay demasiados nombres de archivos para ver si hay más de una coincidencia.

c26cf8a solo contiene suficientes posibilidades, 16 ^ 7 o 2 ^ 28 o 268,435,456, por lo que es muy poco probable que otro compromiso comparta ese prefijo.

Básicamente, Git utiliza el sistema de archivos como un simple almacén de clave / valor, y puede buscar claves parciales sin tener que escanear la lista completa de claves.

Esa es una forma de almacenar objetos. Cada vez más, Git almacena sus objetos en packfiles de packfiles . Es una forma muy eficiente de almacenar solo los cambios entre archivos. De vez en cuando, su repositorio de Git examinará lo que está en .git/objects y almacenará solo las diferencias en .git/objects/pack/pack-<checksum> .

Ese es un formato binario, no voy a entrar aquí, y de todos modos no lo entiendo. :)


Un hash corto son solo los primeros 7 caracteres de tu hash completo.

Justo debajo de la confirmación circulada en su captura de pantalla, puede ver una confirmación con la etiqueta c26cf8a . Esta debe ser la confirmación c26cf8af130955c5c67cfea96f9532680b963628 que buscabas.