Модуль 2 · Первый репозиторий в VS Code

Справочник по Git и GitHub · модуль 2 · первый репозиторий в VS Code

Глава 2.4

2.4

История проекта:
граф, коммиты, авторы строк

В главе разобрано, как читать историю проекта: где она показана в VS Code, в терминале и на GitHub, что видно внутри коммита и как отобрать коммиты, менявшие один файл. В конце показано, как узнать, в каком коммите появилась строка и кто её автор.

Категория
Чтение истории
Уровень
Начальный
Что получится
Умение найти нужный коммит и автора любой строки
Сколько занимает
Около двадцати минут за компьютером

§1Зачем читать историю

История нужна, чтобы узнать, как и почему менялся проект:

Зачем это нужно в работе

  • Найти коммит с ошибкой. Страница перестала работать после недавних правок. История показывает коммиты за это время, среди них ищут тот, что внёс ошибку.
  • Разобраться в чужом коде. Назначение строки неясно. История показывает, в каком коммите и кем она добавлена, а сообщение коммита объясняет причину.
  • Вернуть удалённый файл. Файл, удалённый месяц назад, остаётся в прошлых коммитах, и нужную версию достают из истории.
  • Отчёт о работе. Список коммитов за неделю показывает, что сделано, с датами и сообщениями.

В главе используется проект sait-vizitka из прошлых глав. В нём шесть коммитов: четыре получены при клонировании, два сделаны в главе 2.3.

§2Шаг 1. Открыть раздел Graph

История проекта показана в панели Source Control.

Открываем панель Source Control. Под списком изменений находится раздел GRAPH. Если он слишком узкий, раздел CHANGES сворачивают щелчком по заголовку.

Раздел Graph в панели Source Control: шесть коммитов, у двух верхних метки main и origin/main
Коммиты идут сверху вниз от последнего к первому. Рядом с сообщением указан автор.

Синяя метка main отмечает коммит, на котором вы стоите. Фиолетовая origin/main отмечает последний коммит копии проекта на GitHub. Два коммита между ними сделаны у вас и на сервер не отправлены.

Строка состояния: main, стрелки обмена и цифра 2 у стрелки вверх
То же показывает строка состояния: 2↑ — два коммита не отправлены. Отправка разобрана в модуле 4.

Строка Outgoing Changes вверху графа объединяет те же два неотправленных коммита.

Что получилось.Видна вся история: шесть коммитов, метки main и origin/main.

§3Шаг 2. Посмотреть, что внутри коммита

Каждый коммит в графе раскрывается в список файлов.

Нажимаем на коммит Добавил страницу контактов. Под строкой появляется список файлов коммита.

Раскрытый коммит в графе: под ним файлы index.html с буквой M и kontakty.html с буквой A
В коммите два файла. Буквы те же, что в списке изменений: M — файл был изменён, A — добавлен.

По этому списку проверяют, все ли нужные файлы вошли в коммит и нет ли лишних.

Что получилось.Видны файлы коммита «Добавил страницу контактов»: index.html и kontakty.html.

§4Шаг 3. Открыть изменения построчно

Изменения в файле коммита открываются построчно.

Дважды щёлкаем по файлу внутри коммита. Открывается окно сравнения. В нём сравниваются две версии файла: до этого коммита и после него.

Окно сравнения: заголовок вкладки index.html (745f2e1) ↔ index.html (2e4864c), изменённая строка title и добавленная ссылка
Заголовок вкладки: слева версия файла из коммита 745f2e1, справа — из коммита 2e4864c. Подсвечены различия между ними.

Строки из букв и цифр в скобках — имена коммитов: сначала предыдущего, затем открытого. Эти имена разобраны в следующем параграфе.

Что получилось.Видно построчно, что этот коммит изменил в index.html.

§5Справка: имя коммита

У каждого коммита есть имя — длинная строка из букв и цифр, которую Git вычисляет по содержимому. Это хеш. В полном виде он выглядит так:

терминалкоманда и ответ
git log -1 --format=%H
745f2e16ef3422f5063e9dde2af6036fc8349ffe

Обычно используют первые семь символов: 745f2e1. Такие короткие имена показаны в графе, в выводе команд и в заголовке окна сравнения.

Где встречаетсяКак выглядитЧто с ним делают
Вывод git log --oneline745f2e1Копируют, чтобы открыть коммит или откатиться к нему
Заголовок окна сравнения(745f2e1) ↔ (2e4864c)Понимают, какие версии сравниваются
Страница коммита на GitHubcommit 745f2e1Ссылку на страницу отправляют коллеге
Вывод git blame8da3e92eСмотрят, из какого коммита пришла строка
На полях: почему имя не порядковый номер

Для порядковых номеров нужен общий счётчик, а копия истории есть у каждого участника. Хеш вычисляется из содержимого коммита, поэтому один и тот же коммит имеет одно имя на любом компьютере, а изменённый коммит получает новое имя.

§6Шаг 4. История одного файла

Граф показывает историю всего проекта. Историю одного файла показывает раздел в проводнике.

Открываем файл index.html, переходим в проводник (CtrlCmd + Shift + E) и раскрываем внизу раздел TIMELINE.

Раздел Timeline в проводнике: четыре коммита, которые меняли index.html, с именами авторов и временем
В разделе только коммиты, менявшие index.html: четыре из шести. Справа указано, сколько времени прошло.

Щелчок по строке открывает сравнение файла до коммита и после. Так находят коммит, после которого в файле появилась ошибка.

Что получилось.Видны четыре коммита, которые меняли index.html.

§7Шаг 5. То же самое в терминале

В инструкциях и на форумах историю показывают командами терминала.

Вся история коротким списком. Ключ --graph рисует слева линию истории; ветки на ней разобраны в модуле 3:

терминал в папке проектакоманда и ответ
git log --oneline --graph
* 7a74ca0 Увеличил отступы страницы
* 2e4864c Добавил страницу контактов
* 745f2e1 Добавил README с описанием проекта
* 8da3e92 Добавил абзац о себе
* 8e377ad Подключил файл со стилями
* 934282c Первая страница сайта

История одного файла. Имя файла после двух дефисов оставляет в списке только коммиты, менявшие этот файл:

терминалкоманда и ответ
git log --oneline -- index.html
2e4864c Добавил страницу контактов
8da3e92 Добавил абзац о себе
8e377ad Подключил файл со стилями
934282c Первая страница сайта

Это тот же список, что в разделе TIMELINE: четыре коммита из шести.

Состав одного коммита. Команда git show с ключом --stat печатает изменённые файлы и число строк:

терминалкоманда и ответ
git show --stat --oneline 8e377ad
8e377ad Подключил файл со стилями
 index.html |  1 +
 styles.css | 11 +++++++++++
 2 files changed, 12 insertions(+)

Без --stat команда печатает изменения построчно, как окно сравнения.

Что получилось.Те же сведения получены командами git log и git show.

§8Шаг 6. История на GitHub

На GitHub хранится копия отправленных коммитов, и историю читают там же. Это нужно, когда проекта нет на компьютере или коллеге отправляют ссылку.

На странице проекта нажимаем счётчик коммитов, например 4 Commits. Открывается список коммитов.

Страница Commits на GitHub: четыре коммита с сообщениями, авторами и короткими именами
Список коммитов на сервере. Их четыре: два ваших коммита не отправлены.

Открыть коммит. Щелчок по сообщению открывает страницу коммита с изменёнными файлами и строками.

Страница коммита на GitHub: сообщение, метка main, 1 file changed, +14 и зелёные добавленные строки
Коммит 745f2e1: 1 file changed, +14 — добавлено четырнадцать строк. Добавленные строки выделены зелёным, удалённые выделялись бы красным. Строка 1 parent ведёт к предыдущему коммиту.

История файла. Открываем файл на GitHub и нажимаем кнопку History. Открывается список коммитов, менявших этот файл.

Страница истории файла index.html на GitHub со списком коммитов
Тот же отбор, что в разделе TIMELINE и в команде git log -- index.html.

Что получилось.История проекта, отдельный коммит и история файла открыты на GitHub.

§9Шаг 7. Кто написал эту строку

Если назначение строки в файле неясно, перед удалением выясняют, в каком коммите и кем она добавлена.

Открываем файл на GitHub и переключаемся на вкладку Blame.

Вкладка Blame на GitHub: слева от каждой строки кода указан коммит, который её добавил
Слева от каждой строки — коммит, в котором она появилась. Строка со стилями добавлена коммитом «Подключил файл со стилями», абзац — коммитом «Добавил абзац о себе».

То же показывает команда git blame. Ключ -L задаёт диапазон строк:

терминалкоманда и ответ
git blame -L 9,11 index.html
^934282c (MaximBytecamp 2026-09-23 03:58:04 +0300  9)   <h1>Привет, это моя страница</h1>
8da3e92e (MaximBytecamp 2026-09-23 03:58:04 +0300 10)   <p>Учусь работать с Git…</p>
2e4864c4 (Student       2026-09-23 07:21:50 +0300 11)   <p><a href="kontakty.html">Контакты</a></p>

В каждой строке ответа: имя коммита, автор, дата, номер строки и текст. По имени коммита открывают коммит и читают сообщение с причиной правки.

Ассоциация: поля учебника с пометками

В жизни

В учебнике, где пометки оставляли несколько человек, у каждой пометки на полях стоят подпись и дата. По ним видно, кто и когда её сделал.

В Git

Blame подписывает каждую строку файла коммитом, автором и датой. По имени коммита открывается сообщение с причиной правки.

Где не совпадаетПометки на полях сохраняются все, а blame показывает только последнее изменение строки. Если строку позже правил другой человек, blame укажет его. Первоначального автора ищут в более ранних коммитах.

Что получилось.У каждой строки index.html виден коммит, автор и дата.

§10Как искать нужный коммит

В длинной истории коммиты отбирают по файлу, автору, слову в сообщении или дате.

Что ищемВ терминалеНа GitHub
Коммиты, менявшие файлgit log --oneline -- styles.cssОткрыть файл → кнопка History
Коммиты одного автораgit log --author=StudentСписок коммитов → фильтр All users
Слово в сообщенииgit log --grep=контактПоиск по репозиторию с фильтром type:commits
Последние пять коммитовgit log --oneline -5Первая страница списка коммитов
Коммиты со вчерашнего дняgit log --since=yesterdayСписок коммитов → фильтр All time

Состав найденного коммита показывают git show --stat или щелчок в графе. Возврат к прошлой версии разобран в главе 2.6.

§11Частые вопросы

Обычно думаютИстория хранится на GitHub, поэтому без интернета её не посмотреть.
На самом делеИстория лежит в папке .git на вашем компьютере. Граф, Timeline и git log работают без сети. Сервер нужен для обмена коммитами.
Обычно думаютЕсли коммита нет на GitHub, значит, он не сделан.
На самом делеКоммит сделан и хранится у вас. На GitHub он появится после отправки. В графе такие коммиты стоят выше метки origin/main, в строке состояния видно число со стрелкой вверх.
Обычно думаютBlame нужен, чтобы найти виноватого.
На самом делеBlame используют, чтобы найти объяснение правки: сообщение коммита и соседние изменения.
Обычно думаютКороткие имена разных коммитов могут совпасть.
На самом делеКороткое имя — первые символы полного хеша. Git показывает столько символов, сколько нужно, чтобы имя было единственным в репозитории. В больших проектах их больше семи.

§12Проверьте себя

В графе метка main стоит выше метки origin/main. Что это значит?

У вас есть коммиты, которых нет на сервере: все коммиты между двумя метками сделаны локально и не отправлены. В строке состояния это показано числом со стрелкой вверх.

Страница перестала открываться. С чего начать разбор по истории?

Посмотреть последние коммиты: git log --oneline или раздел Graph. Затем открыть коммиты, сделанные после последней работающей версии, и посмотреть их состав. Если известен файл с ошибкой, список сужают: git log --oneline -- имя-файла.

Чем Timeline отличается от раздела Graph?

Graph показывает всю историю проекта, Timeline — коммиты, менявшие открытый файл. Тот же отбор делает команда git log -- имя-файла.

В заголовке окна сравнения написано index.html (745f2e1) ↔ index.html (2e4864c). Что с чем сравнивается?

Версия файла из коммита 745f2e1 (слева, более ранняя) с версией из коммита 2e4864c (справа). Подсвечены строки, которые между этими двумя коммитами изменились.

Назначение строки в файле неясно. Каков порядок действий?

Открыть файл на GitHub, вкладка Blame, найти строку и посмотреть коммит слева от неё. Затем открыть этот коммит и прочитать сообщение с причиной правки. На компьютере то же показывает git blame имя-файла.

Почему у коммита имя вида 745f2e1 и нет порядкового номера?

Имя вычисляется из содержимого коммита и не зависит от порядка и от компьютера. У каждого участника своя копия истории, поэтому общего счётчика для номеров нет.

§13Шпаргалка по главе

Где смотреть в VS Code раздел GRAPH — вся история раздел TIMELINE — история файла
Метки в графе main — где вы сейчас origin/main — где сервер
Команды истории git log --oneline --graph git log --oneline -- файл git show --stat хеш
Автор строки вкладка Blame на GitHub git blame -L 9,11 файл
Поиск коммита --author=имя --grep=слово --since=yesterday
Имя коммита хеш, первые 7 символов 745f2e1

Итог главы

Историю проекта читают в нескольких местах, и везде показаны одни и те же коммиты. Раздел GRAPH в панели показывает всю цепочку с метками main и origin/main; щелчок по коммиту раскрывает список файлов, двойной щелчок — построчные изменения. Раздел TIMELINE оставляет только историю открытого файла. Те же данные дают команды git log, git show и git blame. На GitHub история открывается счётчиком коммитов, а вкладка Blame показывает у каждой строки файла коммит, в котором она появилась. Имя коммита — хеш, обычно его сокращают до семи символов. В следующей главе разобраны служебные файлы: как исключить из истории лишние файлы и описать проект в README.

Откуда взяты факты
  1. Кадры и ответы команд получены на клоне проекта sait-vizitka в Git версии 2.51.1.
  2. Разделы Graph и Timeline — документация VS Code, раздел Source Control.
  3. Ключи git log, git show и git blame — документация git-log, git-blame.
  4. Устройство имени коммита — книга Pro Git.
Глава 2.4 · История проекта · Справочник по Git и GitHub Автор: Макаров Максим Николаевич