Git tiene traccia dei contenuti dei file, non dei nomi dei file. Quindi rinominare un file senza modificarne il contenuto è facile da rilevare per git. (Git non tiene traccia, ma esegue il rilevamento ; usando git mv
o git rm
ed git add
è effettivamente lo stesso.)
Quando un file viene aggiunto al repository, il nome del file si trova nell'oggetto albero. Il contenuto effettivo del file viene aggiunto come un oggetto binario di grandi dimensioni ( BLOB ) nel repository. Git non aggiungerà un altro BLOB per file aggiuntivi che contengono lo stesso contenuto. In effetti, Git non può poiché il contenuto è memorizzato nel filesystem con i primi due caratteri dell'hash come nome della directory e il resto è il nome del file al suo interno. Quindi per rilevare le ridenominazioni è questione di confrontare gli hash.
Per rilevare piccole modifiche a un file rinominato, Git utilizza determinati algoritmi e un limite di soglia per vedere se si tratta di una ridenominazione. Ad esempio, dai un'occhiata alla -M
bandiera per git diff
. Sono disponibili anche valori di configurazione come merge.renameLimit
(il numero di file da considerare quando si esegue il rilevamento della ridenominazione durante un'unione).
Per capire come git tratta file simili (cioè quali trasformazioni di file sono considerate come rinominate), esplora le opzioni di configurazione e le flag disponibili, come menzionato sopra. Non devi essere considerato con il come. Per capire come git esegue effettivamente queste attività, guarda gli algoritmi per trovare le differenze nel testo e leggi il codice sorgente di git.
Gli algoritmi vengono applicati solo per scopi di diff, merge e log - non influenzano il modo in cui git li memorizza. Qualsiasi piccola modifica nel contenuto del file significa che viene aggiunto un nuovo oggetto. Non ci sono differenze o differenze a quel livello. Naturalmente, in seguito, gli oggetti potrebbero essere impacchettati dove i delta sono memorizzati nei file di pacchetto, ma ciò non è correlato al rilevamento della ridenominazione.