Единственная информация, которую Git хранит от одной ревизии к следующей, - это состояние (имена и содержимое) файлов в каждой ревизии. В редакции A этот файл содержал это содержимое, а в редакции B этот файл содержал другое содержимое. Git не волнует как файлы, полученные из точки А в точку Б, будь то редактирование, или переименование, или разрешение конфликтов, или слияние осьминога.
Преимущество этого подхода заключается в концептуально простом формате хранилища. Это важно, потому что ваш репозиторий - это ваша история, и история должна быть сохранена в самом простом формате.
Одним из следствий этого является то, что всякий раз, когда Git нужно выяснить, что произошло между ревизиями A и B (например), он должен проработать детали в тот момент, когда вы об этом просите. Даже для простого сравнения, в то время как некоторые инструменты могут просто показать внутренне сохраненный дифференциал, Git сравнивает файлы в ревизии A и B и регенерирует разницу по запросу. Для переименований Git замечает, что только что появился новый файл, и ищет похожие файлы в предыдущей ревизии, чтобы угадать, был ли файл переименован или нет.
По мере того, как инструменты Git совершенствуются с течением времени, можно сообщить больше о том, как история сформировалась, без необходимости ее записи в данный момент. Например, часто утверждается, что Git может «отслеживать отдельные биты кода, перемещающиеся из одного файла в другой». Это полностью связано с умом программ, создающих отчеты по истории, а не с тем, что хранится в самом хранилище.