Урок курса
Найти и прочитать нужное изменение
Git и GitHub с нуля: бесплатный курс с практикойgit diff --staged показывает подготовленные изменения, а git commit сохраняет полный снимок из индекса в истории. git log --oneline выводит сохранённые коммиты с ID и сообщениями, а git show <ID> раскрывает сообщение и файловый diff выбранного коммита. Путь после -- в git log ограничивает историю изменениями указанного файла.
ID коммита: SHA-1-хеш и сокращённая форма
В учебных репозиториях этого курса ID коммита — SHA-1-хеш длиной 40 шестнадцатеричных символов. Он вычисляется из данных объекта коммита: ссылки на снимок файлов, ссылки на родительский коммит, сведений об авторе и создателе коммита, дат и сообщения. Одинаковые данные объекта дают одинаковый хеш. Это не математическая гарантия отсутствия коллизий: разные данные теоретически могут дать один хеш.
Полный ID из примера этого урока выглядит так:
a0b66a5098d53cd0c8242abecfa419e8a695d9a4
Git позволяет адресовать объект однозначным началом полного ID — например, первыми 7 символами a0b66a5. Короткий префикс должен отличать нужный объект от остальных в данном репозитории. Если Git сообщает о неоднозначности, используйте больше символов полного ID. git log --oneline показывает сокращённые ID подходящей длины.
ID — стабильный идентификатор объекта коммита. Он не меняется от появления новых коммитов, течения времени или копирования того же объекта в другой репозиторий. Более короткий префикс со временем может стать неоднозначным, но полный ID существующего объекта остаётся прежним.
Хеш не нужно запоминать: найдите нужный коммит через git log --oneline, скопируйте его ID и передайте следующей команде. Все показанные в этом уроке ID иллюстративны. При самостоятельном выполнении берите ID из своей истории: ваши авторские данные и даты отличаются, поэтому значения будут другими.
git log --oneline и git show: чтение истории и содержимого коммита
git log --oneline выводит историю коммитов в компактном виде: один коммит — одна строка. Слева стоит сокращённый хеш, справа — первая строка сообщения коммита.
Подготовка короткой истории. Для независимого примера создайте новую пустую папку git-history рядом с прежней учебной папкой. Перейдите в родительский каталог через cd .., затем выполните уже изученные команды. Если имя занято, выберите другое.
mkdir git-history
cd git-history
git init -b main
git config user.name "Student"
git config user.email "student@example.com"
Через обычный текстовый редактор создайте README.md в UTF-8 с точным содержимым ниже. Пустая строка между заголовком и описанием тоже нужна; последнюю строку завершите переводом строки.
# My project Описание проекта.
Сохраните и создайте первый коммит:
git add README.md
git commit -m "Init project"
Теперь в редакторе допишите в конец README.md пустую строку и блок контактов, чтобы файл целиком выглядел так:
# My project Описание проекта. ## Контакты ivan@example.com
Сохраните файл с переводом строки в конце и зафиксируйте эту правку:
git add README.md
git diff --staged
git commit -m "Add contacts"
Следующим отдельным действием создайте в редакторе notes.md с одной строкой Заметки проекта. и переводом строки в конце. README.md на этом шаге не меняйте.
git add notes.md
git commit -m "Add notes"
Наконец, через редактор замените в README.md только строку Описание проекта. на Краткое описание проекта.. Сохраните файл и создайте четвёртый коммит:
git add README.md
git diff --staged
git commit -m "Update intro"
git status
Статус должен сообщить nothing to commit, working tree clean. Теперь есть четыре коммита: README.md создан в Init project, контакты добавлены в Add contacts, только notes.md добавлен в Add notes, описание README.md изменено в Update intro. Других файлов и изменений в этом примере нет.
Для подготовленного репозитория вывод может выглядеть так (ID — иллюстративные):
c53f9b0 Update intro
9a9c7fa Add notes
a0b66a5 Add contacts
0485aeb Init project
Список идёт от новых коммитов к старым: верхняя строка — последний коммит, нижняя — самый первый. Если история длиннее экрана, Git откроет постраничный просмотр; для выхода нажмите q.
Получив сокращённый хеш из своего вывода, можно прочитать содержимое выбранного коммита командой git show. Например, в показанной истории для Add contacts это:
git show a0b66a5
Вывод git show состоит из нескольких частей. Сначала идут метаданные:
commit a0b66a5098d53cd0c8242abecfa419e8a695d9a4
Author: Ivan Petrov <ivan@example.com>
Date: Mon Jun 2 14:30:00 2025 +0300
Add contacts
Затем — файловый diff: для каждого изменённого файла показывается, какие строки были удалены (со знаком − и красным фоном в большинстве терминалов) и какие добавлены (со знаком + и зелёным фоном):
diff --git a/README.md b/README.md
index 3acb296..4ddae8f 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,7 @@
# My project
Описание проекта.
+
+## Контакты
+
+ivan@example.com
Здесь строки с + — это то, что появилось в этом коммите. Строки с пробелом в начале — контекст: они не изменились, Git показывает их для ориентации.
git show ничего не меняет в репозитории: это команда чтения. Если вывод длиннее экрана, снова откроется постраничный просмотр — выйти из него можно клавишей q.
git log -- <файл>: поиск коммита, затронувшего конкретный файл
Полная история репозитория включает все коммиты подряд. Когда нужно найти только те коммиты, где менялся конкретный файл, используют фильтрацию по пути:
git log --oneline -- README.md
Двойное тире -- отделяет опции и ревизии от аргумента-пути. Технически в большинстве простых случаев -- можно опустить, но с ним команда читается однозначно: всё, что после --, Git воспринимает как путь к файлу, а не как имя ветки или опцию.
Вывод команды выглядит точно так же, как обычный git log --oneline, но содержит только коммиты, в которых файл README.md действительно изменялся:
c53f9b0 Update intro
a0b66a5 Add contacts
0485aeb Init project
Коммит 9a9c7fa Add notes в список не попал — в нём добавили только notes.md. Init project остался в списке: создание README.md тоже является изменением этого файла.
Сквозной сценарий поиска изменения
В подготовленной выше истории найдём коммит, в котором в README.md появились контактные данные. В командах ниже используйте свой ID из своего вывода; показанные значения иллюстративны.
Шаг 1. Получить компактную историю всего репозитория:
git log --oneline
c53f9b0 Update intro
9a9c7fa Add notes
a0b66a5 Add contacts
0485aeb Init project
Шаг 2. Отфильтровать только коммиты, касавшиеся README.md:
git log --oneline -- README.md
c53f9b0 Update intro
a0b66a5 Add contacts
0485aeb Init project
По сообщению «Add contacts» видно, что нужный коммит, скорее всего, a0b66a5. В своём репозитории скопируйте хеш прямо из строки Add contacts своего вывода.
Шаг 3. Прочитать содержимое коммита:
git show a0b66a5
В выводе найдём блок diff для README.md. Строки с + покажут именно то, что добавил этот коммит:
+## Контакты + +ivan@example.com
Этот вывод подтверждает: строки с контактами появились именно в коммите a0b66a5 Add contacts. В своём репозитории подтвердите те же добавленные строки по своему выводу git show. ID берётся из вывода шага 2 и не заучивается.
Задача 1
В компактной истории найдена строка 4dc21a8 Fix typo in README. Нужны три разных результата: (1) компактная история ветки, (2) добавленные и удалённые строки найденного коммита, (3) компактная история только README.md. Какая строка сопоставляет команды этим результатам?
Задача 2
Практика: подготовьте историю из примера этого урока с коммитом «Add contacts». Получите компактную историю, отфильтруйте README.md, скопируйте ID этого коммита и откройте его через show. Запишите полученный в вашем репозитории ID и добавленные строки контактов; отдельно отметьте, есть ли удалённые строки текста. Не считайте заголовки +++, --- и @@ изменениями содержимого. Письменно объясните коллеге, где получить ID для show и почему его не нужно помнить наизусть.
Платформа проверяет только ответ ниже; действия в своём репозитории и письменные ответы вы проверяете самостоятельно.
В контрольном случае сообщение найденного коммита обещает «Add contacts», но в его diff показаны только изменения notes.md. Можно ли считать этот коммит подтверждённым источником контактных строк README?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
