Git suit le contenu des fichiers, pas les noms de fichiers. Donc, renommer un fichier sans changer son contenu est facile à détecter pour git. (Git ne suit pas, mais effectue la détection ; utiliser git mv
ou git rm
et git add
est en fait identique.)
Lorsqu'un fichier est ajouté au référentiel, le nom de fichier se trouve dans l'objet d'arborescence. Le contenu réel du fichier est ajouté en tant qu'objet binaire volumineux ( blob ) dans le référentiel. Git n'ajoutera pas un autre objet blob pour les fichiers supplémentaires contenant le même contenu. En fait, Git ne le peut pas car le contenu est stocké dans le système de fichiers avec les deux premiers caractères du hachage étant le nom du répertoire et le reste étant le nom du fichier qu'il contient. Donc, pour détecter les changements de noms, il s'agit de comparer les hachages.
Pour détecter de petites modifications dans un fichier renommé, Git utilise certains algorithmes et une limite de seuil pour voir s'il s'agit d'un changement de nom. Par exemple, regardez le -M
drapeau pour git diff
. Il existe également des valeurs de configuration telles que merge.renameLimit
(le nombre de fichiers à prendre en compte lors de la détection de changement de nom lors d'une fusion).
Pour comprendre comment git traite les fichiers similaires (c'est-à-dire quelles transformations de fichiers sont considérées comme des renoms), explorez les options de configuration et les indicateurs disponibles, comme mentionné ci-dessus. Vous n'avez pas besoin d'être considéré avec le comment. Pour comprendre comment git accomplit réellement ces tâches, regardez les algorithmes permettant de trouver des différences dans le texte et lisez le code source de git.
Les algorithmes ne sont appliqués qu'à des fins de diff, de fusion et de journalisation - ils n'affectent pas la façon dont git les stocke. Tout petit changement dans le contenu du fichier signifie qu'un nouvel objet est ajouté pour celui-ci. Il n'y a pas de delta ou de diff à ce niveau. Bien sûr, plus tard, les objets peuvent être regroupés là où les deltas sont stockés dans des fichiers de paquets, mais cela n'est pas lié à la détection de changement de nom.