¿Cómo rastrea git el código fuente movido entre files?

Aparentemente, cuando mueve una function de un file de código fuente a otro, el logging de revisión de git (para el nuevo file) puede mostrarle de dónde proviene originalmente ese fragment de código (consulte, por ejemplo, la sección Historial de visualización en este tutorial ).

¿Como funciona esto?

No los rastrea. Esa es la belleza de eso.

Git solo graba instantáneas de todo el tree del proyecto: así es como se veían todos los files antes de la confirmación y así es cómo se ven después. Cómo llegamos de aquí para allá, a Git no le importa.

Esto permite que se escriban herramientas inteligentes después de que una confirmación ya haya ocurrido, para extraer información de esa confirmación. Por ejemplo, la detección de cambio de nombre en Git se hace comparando todos los files eliminados con todos los files nuevos y comparando las mediciones de similitud por pares. Si la métrica de similitud es mayor que x , se consideran renombrados, si se encuentra entre y y x ( y < x ), se considera que es una edición de renombre +, y si está por debajo de y , se consideran independientes. Lo bueno es que usted, como "arqueólogo de compromiso", puede especificar después del hecho, lo que deberían ser y . Esto no funcionaría si el compromiso simplemente registrara "este file es un cambio de nombre de ese file".

La detección de contenido movido funciona de manera similar: corta cada file en pedazos, calcula métricas de similitud entre todos los sectores y puede deducir que este segmento que se eliminó aquí y este segmento muy similar que se agregó allí son en realidad el mismo segmento que se movió de aquí para allá.

Sin embargo, como tonfa mencionó en su respuesta, esto es muy caro, por lo que normalmente no se hace. Pero podría hacerse, y ese es el punto.

Por cierto: esto es prácticamente lo opuesto al model de Transformación Operacional utilizado por Google Wave, EtherPad, Gobby, SubEthaEdit, ACE y Co.

Es puramente una heurística. Compara la distancia entre files e intenta encontrar bloques coincidentes. Pero esta heurística solo se implementa cuando el código se copy o se mueve a un nuevo file (de lo contrario, sería demasiado costoso verificar cada par de files).