Si mi índice provisional está vacío, ¿por qué `git rm` borra un file que no está allí?

De acuerdo con la documentation de git rm , así es como se comporta:

Eliminar files del índice, o del tree de trabajo y el índice

Si acabo de hacer una confirmación y mi índice está vacío, la ejecución de git rm some_file pondrá en escena la eliminación de some_file . Esperaría que no haga nada. ¿Por qué está eliminando un file inexistente y cuál es el efecto final en el repository?

El truco aquí es que el índice no está vacío después de una confirmación.

De hecho, contiene exactamente lo que tenía antes y durante la confirmación.

No estoy seguro de dónde viene esta noción. Es cierto que git commit tiene una bandera deletreada --allow-empty , que tal vez hace que parezca que el índice estaría vacío en este punto, pero es la ortografía de la bandera la que es engañosa: lo que permite es un diff vacío, en lugar de un compromiso vacío.

También es cierto que git add agrega cosas nuevas al índice, pero en el caso de un file que ya está allí, las cosas nuevas que se agregan simplemente desplazan la input anterior que ya está allí. (¿Quizás la ortografía de git add es lo que lleva a la gente a suponer que el índice está vacío después de una confirmación?)

(Otro bit un poco peculiar es que git rm también agrega algo: específicamente, un logging para decir que "este nombre de ruta, que existe en el compromiso HEAD , no debería existir en el siguiente compromiso". Esto se debe a que el índice juega un rol dual: no es solo "qué poner en el siguiente compromiso", sino también un caching para acelerar el escaneo de git a través de su tree de trabajo. De hecho, puede eliminar el file de índice por completo, lo cual lo desaparece todo pero no lo hace t progtwigr cualquier cosa para la eliminación: git simplemente reconstruye el índice de la confirmación HEAD en este caso).