Чтобы увидеть, чем отслеживаемый файл отличается от более ранней версии в репозитории Git на Mac, откройте Терминал, перейдите в репозиторий и выполните git diff REVISION -- path/to/file. Замените REVISION коммитом, например HEAD~1, а путь — относительным путем к файлу в репозитории. Это действие сравнивает версию из коммита с файлом в его текущем состоянии в рабочей копии; сам файл при этом не изменяется.

Откройте Терминал в репозитории

Найдите папку репозитория в Finder. Откройте Терминал, введите cd с пробелом на конце, перетащите папку репозитория в окно Терминала и нажмите Return. Apple описывает перетаскивание объектов в Терминал как способ указания путей к файлам и папкам. Убедитесь, что вы находитесь в рабочем дереве Git, с помощью команды:

git status

Если Git сообщает, что текущий каталог не является репозиторием, перейдите в корневую папку репозитория и повторите попытку. По информации Apple, по умолчанию в macOS Терминал использует оболочку zsh. Приведенные ниже команды работают в этой оболочке; в них пути заключены в кавычки, поэтому пробелы в именах сохраняются.

Сравнение текущего файла с более ранней версией

Используйте следующий формат:

git diff REVISION -- "path/to/file"

Например, чтобы сравнить текущий файл Sources/Menu.swift с его версией на один первый родительский коммит раньше текущего HEAD, выполните:

git diff 'HEAD~1' -- "Sources/Menu.swift"

Символ -- отмечает конец аргументов ревизий и опций и начало пути. В документации Git указано, что такая форма сравнивает рабочее дерево с указанным коммитом. В выводе строки, начинающиеся с -, относятся к более ранней версии, строки с + — к текущему файлу, а окружающие неотмеченные строки служат для контекста. Документация по git diff

HEAD~1 означает первого родителя текущего коммита; HEAD~2 отступает на два шага по первым родителям. Это удобно для недавней истории, но может не указать на точное изменение, которое вы ищете, особенно в случае слияний. Синтаксис ревизий Git также принимает имена веток, теги и идентификаторы коммитов. Используйте конкретный найденный коммит, когда вам нужна точная точка в истории. Синтаксис ревизий Git

Чтобы найти коммит, в котором изменялся файл, просмотрите его историю:

git log --oneline -- "Sources/Menu.swift"

Скопируйте нужный ID коммита из вывода и используйте его в команде diff:

git diff 4f2a9c1 -- "Sources/Menu.swift"

Замените 4f2a9c1 фактическим идентификатором из вашего репозитория. Git принимает однозначный сокращенный ID коммита; если он неоднозначен или недействителен, укажите более длинный идентификатор или другое имя ревизии.

Выбор подходящего типа сравнения

Сравнение с рабочим деревом включает любые текущие правки в файле, как индексированные, так и неиндексированные. Если же вы хотите сравнить две зафиксированные версии, укажите обе ревизии:

git diff OLD_REV NEW_REV -- "Sources/Menu.swift"

Например, git diff 'HEAD~3' HEAD -- "Sources/Menu.swift" сравнивает закоммиченный файл на три шага назад по первым родителям с версией в текущем коммите. Это сравнение не включает незакоммиченные изменения. Git описывает форму с двумя коммитами как сравнение двух произвольных коммитов. Документация по git diff

Если вам нужно выполнить сравнение с версией, подготовленной для следующего коммита (staged), команда Git в форме --cached сравнивает индекс с коммитом. Например:

git diff --cached HEAD -- "Sources/Menu.swift"

Это решает другую задачу по сравнению с анализом текущего рабочего файла: команда показывает проиндексированные изменения относительно HEAD.

Разбор пустого вывода и частых ошибок

Отсутствие вывода diff обычно означает, что Git не видит различий для этого пути между выбранной ревизией и указанным текущим состоянием. Проверьте правильность написания пути и регистр букв, а также убедитесь, что вы находитесь внутри нужного репозитория. Если Git сообщает, что путь неизвестен в указанной ревизии, возможно, файл тогда еще не существовал или его путь изменился. Чтобы просмотреть переименованный или удаленный файл, используйте его прежний путь и проверьте список файлов или журнал нужного коммита.

Файл, который никогда не отслеживался Git, не имеет сохраненных версий для сравнения. Кроме того, стандартный текстовый diff в Git может не предоставить удобного построчного сравнения для бинарных файлов. Команда только отображает изменения; она не восстанавливает старую версию. Не используйте git checkout или git restore, если ваша цель — только просмотр, поскольку эти команды оказывают другое воздействие на файлы.

Для более компактного просмотра добавьте меньшее количество строк контекста, например git diff -U1 'HEAD~1' -- "Sources/Menu.swift". Опция -U в Git регулирует количество отображаемых окружающих строк контекста. После того как вы определили нужную ревизию и путь, эта команда обеспечит наглядное и воспроизводимое отображение различий, не затрагивая сам файл.

Источники