Чтобы найти коммит, который последним изменил строку в локальном проекте Git на вашем Mac, откройте Терминал, перейдите в репозиторий и выполните git blame для файла с указанием диапазона строк. Затем изучите этот коммит с помощью git show, чтобы просмотреть его сообщение и diff. Blame определяет последнее изменение текущей строки; команда не всегда показывает, когда строка появилась впервые или почему она была написана.
1. Откройте репозиторий в Терминале
Если проект уже открыт в Finder, запустите Терминал, введите cd , затем перетащите папку проекта в окно Терминала и нажмите Return. macOS сама вставит путь к папке, что поможет избежать опечаток. Либо введите путь вручную, заключив его в кавычки, если он содержит пробелы, например:
cd "/Users/sam/Projects/My App"
Убедитесь, что вы находитесь внутри рабочего дерева Git и что Git доступен:
git status --short
git --version
Если первая команда сообщает, что текущий каталог не является репозиторием Git, перейдите в фактический каталог репозитория проекта. Если git недоступен, установите или включите Git с помощью проверенного вами способа настройки, прежде чем продолжить. Приведенные ниже команды используют стандартный синтаксис оболочки и работают как в стандартной командной оболочке Терминала macOS, так и в других распространенных оболочках.
2. Запустите blame для нужной строки
Найдите номер строки в редакторе, а затем подставьте путь к файлу и номер строки ниже. Путь указывается относительно корня репозитория; заключите его в кавычки, если он содержит пробелы или метасимволы оболочки.
git blame -L 42,42 -- "Sources/Settings.swift"
-L 42,42 ограничивает аннотацию строкой 42. Git нумерует строки начиная с 1. Чтобы просмотреть окружающий контекст, используйте диапазон, например -L 38,46. Git выведет идентификатор коммита, данные автора, дату и текст строки. В документации указано, что blame показывает редакцию и автора, которые последними изменили каждую строку, а также поддерживает выбор диапазонов строк с помощью -L. Документация по Git blame
Если вы не знаете номер строки, откройте файл в редакторе и посмотрите номера строк там. Вы также можете выполнить blame для всего файла, опустив -L:
git blame -- "Sources/Settings.swift"
Если вы находитесь не в корне репозитория, используйте путь относительно каталога, в котором была выполнена команда. Если Git сообщает, что путь не существует, проверьте как ваш текущий каталог (pwd), так и точность написания пути с учетом регистра.
3. Изучите коммит, определенный с помощью blame
Скопируйте идентификатор коммита, отображаемый для целевой строки, и передайте его в git show:
git show --format=fuller --stat a1b2c3d
Замените a1b2c3d на идентификатор из вашего вывода. Это отобразит метаданные коммита и сводку по файлам. Чтобы просмотреть также и патч, опустите --stat:
git show --format=fuller a1b2c3d
Обратите внимание на измененные строки вокруг целевой строки, сообщение коммита и другие файлы, измененные в том же коммите. Эти детали помогут понять контекст изменения. Сообщение коммита фиксирует то, что написал его автор; оно не гарантирует полного объяснения проектных решений. Согласно документации Git, git show отображает информацию о коммите и его текстовый diff. Документация по Git show
Когда blame указывает на коммит с форматированием или переносом кода
Строка могла быть затронута масштабным форматированием, переименованием или переносом кода. В этом случае коммит, на который указывает blame, может не быть тем, в котором логика была реализована изначально. Попробуйте включить отслеживание перемещений и копирований:
git blame -M -C -L 42,42 -- "Sources/Settings.swift"
Флаг -M указывает Git искать строки, перемещенные внутри файла, а -C — также строки, скопированные или перемещенные из других файлов. Эти параметры помогают Git отслеживать некоторые рефакторинги, однако определение зависит от совпадения содержимого и может срабатывать не во всех случаях истории. Документация по Git blame
Если в репозитории есть файл .git-blame-ignore-revs для масштабных изменений (например, форматирования), вы можете указать Git использовать его:
git blame --ignore-revs-file .git-blame-ignore-revs -L 42,42 -- "Sources/Settings.swift"
Это может упростить поиск нужного изменения, однако игнорируемые ревизии влияют на вывод аннотации; изучите файл исключений репозитория или сравните результат с запуском blame без этого параметра, если вывод покажется неожиданным. Этот параметр описан в документации Git, а соглашение об использовании файла игнорируемых ревизий поддерживается и в GitHub. Документация по Git blame
Что blame не может показать
Blame аннотирует строки, существующие в выбранной версии файла. Команда не показывает напрямую удаленные или замененные строки, а коммит с последним изменением может отличаться от коммита, где строка появилась впервые. Чтобы найти удаленный текст или более ранние состояния файлов, проверяйте историю и diff коммитов; документация Git blame рекомендует использовать git diff и поиск по истории для изменений, которые удалили или заменили содержимое. Документация по Git blame
Если репозиторий размещен на GitHub и у вас есть к нему доступ, вы также можете открыть файл и выбрать Blame, чтобы просмотреть построчную историю прямо в браузере. Нажмите на сообщение коммита, чтобы изучить это изменение, или используйте переключатель версий, чтобы просмотреть файл до него. Документация GitHub: Просмотр и понимание файлов
Источники
Документация по Git show — Git
Просмотр и понимание файлов — GitHub Docs