Поиск причины изменения
На сайте обнаружилась неправильная ссылка, но каталог уже редактировали несколько авторов. Чтобы исправить её осмысленно, полезно понять, когда изменился адрес, какие соседние файлы были затронуты и какое требование пытались выполнить. Одна дата изменения файла не отвечает на эти вопросы.
Рассмотрим историю нашего Markdown-каталога. Сценарий lesson-10 в архиве создаёт небольшую самостоятельную линию: исходный список, уточнение описания, ошибочный адрес и заметка README. Буквы на схемах обозначают учебные узлы, а не настоящие хеши. Все результаты ниже ожидаемые, команды ещё не выполнялись.
От текущей строки к записи
В рабочем content/courses.md ссылка JavaScript ведёт на /courses/javascript-next/. По условию лаборатории такой страницы нет: действительный постоянный путь — /courses/javascript/. Ссылка HTML/CSS и рекомендации читателю сохранены. Сначала прочитайте файл и текущее состояние, затем посмотрите историю только этого пути:
git status --short
git log --oneline -- content/courses.md
git log -p -- content/courses.md
Первое действие должно показать чистое дерево. Короткий список помогает выбрать запись, подробный — увидеть замену текста. Ограничение пути удерживает внимание на каталоге. При этом соседний README мог изменяться в тех же коммитах: для полного контекста выбранную запись позднее прочитаем целиком.
Для конкретной строки используйте blame:
git blame -- content/courses.md
Ожидается, что строка JavaScript будет связана с коммитом замены адреса. Это полезный указатель, но ещё не ответ на вопрос «почему». Автор строки мог переносить текст из другого места или выполнять согласованную задачу. Документация blame описывает аннотации последнего изменения строк. Рассматривайте их как вход в исследование, а не как оценку качества человека.
В нашей модели сообщение ошибочной записи — «Подготовить ссылку нового каталога». Уже из него видно намерение: автор ожидал появление новой страницы. Поэтому правка нужна не просто ради возврата старого написания, а ради восстановления существующего перехода до готовности нового маршрута. Требование к текущему поведению формулируется независимо от фамилии автора.
Изменение и объяснение
Скопируйте действительный идентификатор найденной записи. Заполнитель в следующем блоке заменяется вашим значением:
git show ACTUAL_COMMIT_ID
git show ACTUAL_COMMIT_ID -- content/courses.md
В полном просмотре ожидается только изменение адреса, потому что в подготовленной истории задачи разделены. В настоящем проекте вместе с каталогом могли добавляться новый шаблон, редирект или настройки сборки. Тогда узкое сравнение ссылки скрывало бы часть решения. Полный просмотр позволяет увидеть единицу работы и не исправить одну сторону согласованного изменения вслепую.
Сообщение коммита не является доказательством работоспособности. Оно объясняет намерение автора в момент записи. Слова «подготовить» не подтверждают, что путь существует, отвечает успешно или вошёл в опубликованный выпуск. В нашем сценарии отсутствие страницы задано явно, и именно эта предпосылка делает новую ссылку ошибочной.
Запишите короткую заметку исследования: текущий URL, нужный постоянный URL, запись замены и отсутствие целевой страницы в модели. Такой результат полезнее копирования всего лога. Другой разработчик сможет прочитать конкретное различие, понять ожидаемое поведение и предложить исправление, сохранив остальные материалы.
Поиск по содержимому
История может быть слишком длинной для ручного просмотра всех изменений. Если известен характерный адрес, рассмотрим поиск записи, в которой изменилось количество вхождений строки:
git log -S'/courses/javascript-next/' -p -- content/courses.md
В нашей линейной истории ожидается коммит, добавивший новое значение URL. Мы выбрали точную строку, потому что она обозначает предмет ошибки. Если заменить поиск общим словом «курс», результат смешает множество редакционных задач. Руководство log описывает фильтрацию истории; для учебного каталога мы используем её вместе с чтением найденного различия.
Важно понимать границу запроса. Поиск -S связан с изменением количества вхождений строки. Если одинаковая строка перемещена внутри файла без изменения количества, такой критерий может не выбрать запись. Для поиска изменённых строк по выражению есть другой параметр, -G. Выбор зависит от вопроса: ищем появление значения или правку строки определённого вида.
Если файл переименован, обычный ограниченный просмотр нового пути может остановиться у переименования. Для одного файла полезно рассмотреть git log --follow -p -- content/courses.md. Это не повод автоматически считать любой похожий файл его предыдущей версией: Git определяет сходство содержимого, а смысл переноса подтверждает человек.
Для заметки исследования достаточно нескольких предложений, но они должны связываться друг с другом. Например: адрес появился в записи подготовки нового каталога; новый маршрут отсутствует в заданном наборе страниц; текущая ссылка поэтому не выполняет прежний договор; исправление должно вернуть постоянный путь, сохранив пояснения. Такой текст можно использовать при подготовке задачи или ревью. Он не повторяет журнал, зато отделяет известное от предположения. Если сообщение коммита ничего не объясняет, так и запишите: намерение неизвестно, обнаружена только замена значения. Не дополняйте историю вымышленным разговором авторов. В учебной модели причина названа сообщением, но в настоящем проекте дополнительный контекст может потребовать чтения согласованного описания задачи.
История и действительный сайт
Представьте теперь, что в локальном каталоге адрес правильный, а посетитель продолжает видеть старую ошибочную ссылку. Повторный поиск виноватой строки в текущей ветке не объяснит различие: сначала нужно установить, какой снимок опубликован. История исходников, результат сборки и ответ хостинга относятся к разным состояниям.
Для ProfessorWeb это различие особенно заметно: у страницы может сохраниться прежний PHP-подобный URL, хотя её содержимое уже создаётся из Markdown. Поэтому исследование начинается с точного наблюдаемого пути. Похожее название курса ещё не подтверждает, что вы читаете тот же документ или тот же выпуск.
Другая развилка — незаписанная правка. Если статус показывает изменение рабочего файла, текущая строка могла появиться после последнего коммита. Тогда история объясняет только сохранённую основу. Сначала сравните рабочее содержимое с индексом и историей, как в предыдущем уроке. Не приписывайте незаписанный текст записи, которая его ещё не содержит.
Также полезно отделить восстановление причины от устранения последствий. Найденный коммит может подсказать решение, но не даёт автоматического разрешения отменить все его файлы. Если часть задачи уже нужна читателю, исправление должно сохранить её. В нашем небольшом примере изменена одна ссылка, поэтому будущее исправление получится узким.
Конечный результат здесь — объяснение происхождения адреса с конкретной записью и условием ошибки. Рабочий файл остаётся неизменным; мы изучили историю, а не исправили её. В следующем уроке рассмотрим поиск первой проблемной версии, когда причина не видна из одной строки.