Git no arroja información por sí sola *. Todas las versiones anteriores de cada archivo siempre están disponibles para reversiones, diferencias, inspecciones, etc.
Árbol completo versus archivos individuales
Lo que puede estar tratando de conciliar es la idea de acceder a una versión anterior de un archivo individual frente al hecho de que el modelo de historia de Git se centra en todo el árbol. El control de versiones de árbol completo requiere un poco más de trabajo para ver (por ejemplo) la versión foo.c
tal como existía hace diez foo.c
cambios frente a diez cambios de árbol completo:
# 10 foo.c-changes ago
git show $(git rev-list -n 10 --reverse HEAD -- foo.c | head -1):foo.c
# 10 whole-tree-changes ago
git show HEAD~10:foo.c
Los beneficios de la orientación de árbol, principalmente la capacidad de ver los compromisos como una unidad de cambios interdependientes realizados en varias partes de todo el árbol, en general superan en gran medida el tipeo adicional (que puede aliviarse con alias, scripts, etc.) y el tiempo de CPU pasó cavando a través de compromisos pasados.
Eficiencia de almacenamiento
Cuando un nuevo objeto (por ejemplo, un archivo con contenido no visto previamente) ingresa al sistema, se almacena con compresión simple (zlib) como un "objeto suelto". Cuando se acumulan suficientes objetos sueltos (según la gc.auto
opción de configuración; o cuando el usuario ejecuta git gc o uno de los comandos de empaque de nivel inferior), Git recogerá muchos objetos sueltos en un solo "archivo de paquete".
Los objetos en un archivo de paquete se pueden almacenar como datos comprimidos simples (igual que un objeto suelto, simplemente agrupado con otros objetos) o como deltas comprimidos contra algún otro objeto. Los deltas se pueden encadenar a profundidades configurables ( pack.depth
) y se pueden hacer contra cualquier objeto adecuado ( pack.window
controla qué tan ampliamente Git busca la mejor base delta; una versión de un archivo históricamente no relacionado se puede usar como base si hacerlo produciría un buena compresión delta). La latitud que las configuraciones de profundidad y tamaño de ventana le dan al motor de compresión delta a menudo resulta en una mejor compresión delta que la compresión "diff" simple de una versión contra el siguiente / anterior de estilo CVS.
Es esta compresión delta agresiva (combinada con la compresión zlib normal) lo que a menudo puede permitir que un repositorio de Git (con historial completo y un árbol de trabajo sin comprimir) ocupe menos espacio que un único pago SVN (con un árbol de trabajo sin comprimir y una copia prístina).
Vea las secciones Cómo almacena objetos Git y El paquete de archivos del Libro comunitario de Git . También el git-pack de objetos página de manual .
* Puedes decirle a Git que descarta los commits "reescribiendo el historial" y con comandos como git reset , pero incluso en estos casos Git "se aferra" a los commits recientemente descartados por un tiempo, en caso de que decidas que los necesitas. Ver git reflog y git prune .