Чтобы увидеть, чем отслеживаемый файл отличается от более ранней версии в репозитории 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 регулирует количество отображаемых окружающих строк контекста. После того как вы определили нужную ревизию и путь, эта команда обеспечит наглядное и воспроизводимое отображение различий, не затрагивая сам файл.
Источники
Change the default shell in Terminal on Mac — Служба поддержки Apple
Drag items into a Terminal Window — Служба поддержки Apple