Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Эта архитектурная особенность породила мутное высказывание, что Git отслеживает переименование по содержимому файла. При переименовании объект «коммит» будет содержать ссылку на объект «содержимое файла», но если содержимое не изменилось, то это будет ссылка на объект, уже имеющийся в хранилище.Это не мутное высказывание, а вполне себе корректное. Если переименовать файл и немного отредактировать, то гит всё равно будет определять его как переименованный, хотя хэш уже другой. Можно даже настраивать граничное количество отличий, до которого файл будет считаться переименованным, а при превышении этого порога отобразится как пара операций «удаление старого файла + создание нового файла».
diff.renameLimit и/или merge.renameLimit когда вы используете команды git log или git diff. Немного особняком стоит команда git merge — тут переменные diff.renameLimit и merge.renameLimit могут-таки реально повлиять на результат, но, опять-таки, только на состояние файлов в дереве после объединения нескольких веток. Последующий git log будет заново рассчитывать переименования и может придти к совсем другим выводам.Ибо высказывание с подстрокой «Git отслеживает переименования» априори неверно. Не отслеживает Git ничего!Это всего лишь варианты трактовок слова «отслеживает». Его можно понять как «следит за переименованиями и сохраняет их в базе» — разумеется, это будет неправильно. Но «отслеживает» можно также применять в смысле «в процессе показа истории обрабатывает файлы, отслеживая слаборазличающиеся и маркируя их как скопированные/перемещённые».
5ff786ae103161465d84ecdfdc5b0cfd8839eac8 имея абсолютно уверенность о том, что они говорят об одном и том же объекте: у него совпадает содержимое всех файлов и вся история. Даже если они никогда в жизни до этого не сталкивались и одно и то же изменение (с тем же самым сопутствующим описанием) они сделали независимо! А как можно что-то обсуждать используя систему, где условный Вася и условный Петя могут глядеть на коммит с одной и той же меткой, но видя при этом разную историю или, ещё того хуже, разное содержимое? Тут уже централизация потребуется как ни крути, чтобы понять чья история «правильная»…В Git'е сломать историю можно штатными средствами.Сломать — да, легко. Ну так против
rm -rf ни одна DCVS не устоит. А вот изменить — нельзя. С помощь rebase и прочего вы порождаете новую, другую историю — и это хорошо заметно и спрятать это нельзя.Хочешь — включаешь «вьюху» и видишь красивую историю, где показано не то, кто как случайно коммитил, забывая про разделение фич и адекватные комменты, находясь «в потоке» и не желая отвлекаться на весь этот гемор, а показана подправленная версия истории, где какие-то коммиты слиты в один, есть нормальные комменты, ветки по-человечески проименованы т.п.Ну так создайте себе «красивую» историю в отдельной ветке, кто ж вам мешает? Если вы действительно «случайно коммитили, забывая про разделение фич», то вам придётся довольно сильно историю кромсать, чтобы что-то путное получилось. Поставьте в «реперной точке» ссылки на старую историю, или
git tagами их пометьте. Так как git не отслеживает историю, то git diff вы можете сделать между двумя любыми ревизиями проекта, чего должно хватить, чтобы убедиться в том, что вы ничего не потеряли — чего вам ещё нужно?
git fsck --unreachable --no-reflogs
Тайны потерянных коммитов в Git