Я узнал из видеоурока о команде git
git log --diff-filter=R --find-renames
,
и, прочитав документы, я пришел к выводу, что
git log --diff-filter=R
должны дать те же результаты, что и
git log --find-renames
а первую комбинированную команду можно считать опечаткой.
Тем не менее, когда я попробовал это в одном репо, обе команды по отдельности дали одинаковые результаты, а в другом репо только последняя дала какие-либо результаты. Кроме того, я не могу найти никакой документации относительно возможных различий между ними.
Может кто-нибудь сказать мне, в чем разница между этими командами, кроме того факта, что вы можете добавлять разные модификаторы к каждой из них?
Разница на самом деле довольно проста:
Параметр --find-renames
включает механизм поиска переименований, используя порог совпадения файлов по умолчанию, равный 50%. Механизм поиска переименования по умолчанию отключен в довольно старых версиях Git и включен по умолчанию в более новых версиях Git, поэтому, если у вас более новая версия Git (и вы не изменили настройки по умолчанию), добавление --find-renames
к вашему git diff
никакого эффекта.1
Параметр --diff-filter=
устанавливает фильтры, сообщающие Git, какие файлы выборочно отображать после запуска внутреннего механизма сравнения. Выбор R
указывает Git отображать Только те файлы, для которых было обнаружено переименование.
Следовательно, если у вас древняя версия Git, вам нужны параметры обе (или см. сноску 1), чтобы видеть только переименованные файлы, но с современным Git достаточно только параметра --diff-filter=R
, если в конфигурации этого репозитория не отключено обнаружение переименования.
1Есть также несколько ручек конфигурации, которые вы можете установить с помощью git config
или -c
опций. Наиболее подходящим здесь является diff.renames
, который может быть установлен на false
, true
или либо на copy
, либо на copies
. Дополнительные сведения см. в статье git config
документация. Значение по умолчанию diff.rename
изменилось с false
на true
в Git 2.9.0.