Git відстежує вміст файлів, а не імена файлів. Отже, перейменування файлу без зміни його вмісту легко виявити git. (Git не відслідковує, але виконує виявлення , використовуючи git mvабо git rmі git add. Фактично те ж саме)
Коли файл додається до сховища, ім’я файлу знаходиться в об’єкті дерева. Фактичний вміст файлу додається до сховища як двійковий великий об’єкт ( BLOB ). Git не додасть інший BLOB-файл для додаткових файлів, що містять той самий вміст. Насправді Git не може, оскільки вміст зберігається у файловій системі, перші два символи хешу - це ім'я каталогу, а решта - ім'я файлу в ньому. Отже, виявлення перейменувань - це питання порівняння хешів.
Для виявлення невеликих змін у перейменованому файлі Git використовує певні алгоритми та порогове обмеження, щоб побачити, чи це перейменування. Наприклад, подивіться на -Mпрапор для git diff. Існують також такі значення конфігурації, як merge.renameLimit(кількість файлів, які слід враховувати під час виявлення перейменування під час злиття).
Щоб зрозуміти, як git поводиться з подібними файлами (тобто, які перетворення файлів вважаються перейменуваннями), вивчіть доступні параметри конфігурації та прапори, як згадано вище. Вам не потрібно враховувати, як. Щоб зрозуміти, як git насправді виконує ці завдання, подивіться на алгоритми пошуку відмінностей у тексті та прочитайте вихідний код git.
Алгоритми застосовуються лише для цілей diff, merge та log - вони не впливають на те, як git їх зберігає. Будь-яка незначна зміна вмісту файлу означає, що до нього додано новий об’єкт. На цьому рівні не відбувається дельти або різниці. Звичайно, пізніше об’єкти можуть бути упаковані там, де дельти зберігаються у файлах пакунків, але це не пов’язано з виявленням перейменування.