¿A qué se refiere exactamente un índice cuando se habla de compromisos previos?

Realmente no entiendo este concepto del índice correspondiente HEAD. El índice es lo que está a punto de comprometerse, por lo tanto, ¿no debería el índice estar siempre vacío porque todo está comprometido al hacer un reinicio a una confirmación previa?

Saliendo de esta pregunta, parece que el índice git contiene una versión almacenada en caching de todo en lugar de solo los cambios, ¿es esto relevante?

Creo que sé por qué estás confundido. Git no almacena diffs. 1

Creo que ya lo has visto, pero déjame repetirlo: el índice contiene la siguiente confirmación que harás.

Cuando acaba de realizar un commit, lo hizo usando el índice, 2 por lo tanto, no hay diferencia entre "qué hay en el índice ahora" y "qué hay en HEAD ". Eso no significa que el índice esté vacío. De hecho, el índice todavía está lleno de "lo que está en HEAD ". Si ejecuta git commit --allow-empty , git vuelve a comprometer el mismo índice, obteniendo una nueva confirmación que usa el mismo tree que la confirmación anterior. Si en cambio vacias el índice, 3 y luego lo comparas con HEAD , verás que estás a punto de borrar cada file.

Otra cosa que podría ayudar es darse count de que cuando pides a git que compare el índice con una confirmación existente ( git diff --cached , git status , etc.) evoca una nueva diferencia en ese mismo git diff --cached . Hace lo mismo para git diff <commit-1> <commit-2> , y también para git show <commit-id> y git log -p . Git no almacena diffs, genera nuevos cada vez. 4


1 Esto deliberadamente ignora la "compression delta" en los "files de package" de git, que hacen una especie de diferencias de almacenamiento, pero no de la manera en que lo hacen otros sistemas de control de versiones.

2 En realidad, puede usar cualquier cantidad de files de índice diferentes, y algunos commands, como git commit -- <path> , por ejemplo, crean un nuevo índice temporal en lugar de usar el índice "the" (pnetworkingeterminado). Pero normalmente el último compromiso que hizo utilizó el índice, en lugar de algún file de índice temporal alternativo.

3 Para "vaciar" el índice, en realidad tiene que escribir loggings de "eliminar file", porque git volverá a generar el índice si realmente lo convierte en un file vacío, o si lo elimina. Esto se debe a que el índice en realidad tiene una doble function: es tanto "el siguiente compromiso" como "una forma de acelerar git para que no tenga que leer muchos directorys y files".

Además, el --allow-empty es engañoso aquí: significa "permitir que el diff esté vacío", no "permitir que el índice esté vacío".

4 Linus Torvalds describe esto como una característica, porque significa que si alguien hace que git diff más inteligente, esa nueva inteligencia ahora se aplica retroactivamente a cada compromiso anterior. Esta es una observación correcta, y todo lo que cuesta es una pequeña potencia de cálculo de 5 .

5 Y por "un poco" nos referimos a "una carga métrica ****" 🙂