Урок курса

Найти и прочитать нужное изменение

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?

Выберите один вариант
Без регистрации · результат не сохраняется

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку