Модуль 2: Углубляемся в коммиты и историю
Учимся читать историю, смотреть диффы коммитов, исправлять последний коммит и добавлять изменения частями. Разберём структуру коммита и лучшие практики оформления сообщений.
О чём этот модуль
- Структура коммита: дерево файлов, родитель, автор/коммиттер, сообщение
- Чтение истории: oneline/graph/decorate, фильтры по файлам/авторам/датам
- Правки:
--amend
и аккуратное использование - Точечные добавления:
git add -p
для «чистых» коммитов - .gitignore: исключаем лишнее из истории
Хорошие сообщения к коммитам
- Короткая заголовочная строка (до ~72 символов), затем пустая строка и подробности
- Используйте стиль Conventional Commits:
feat:
,fix:
,docs:
,refactor:
и т.п. - Пишите почему, а не только что
Чтение истории — это не столько набор флагов к git log
, сколько умение формулировать вопрос к истории: «кто и когда трогал этот файл?», «какие коммиты привели к регрессии?», «почему появилось это решение?». Освоив фильтры и форматы вывода, вы превращаете историю в полноценный инструмент анализа.
2.1 Анализ истории: git log
git log --oneline --graph --decorate --all
# Отбор по автору/дате/файлу
git log --author="Ivan" --since="2024-01-01" -- README.md
# Показать статистику
git log --stat
# Дифф внутри лога
git log -p -- foo.txt
Старайтесь подбирать формат под задачу. Краткий «граф» полезен для ориентирования, а детальный -p
— для изучения контекста изменений. Помните о диапазонах и селекторах: они позволяют сфокусироваться на интересующем промежутке истории.
2.2 Просмотр конкретного коммита: git show
git show <commit-hash>
# Показать только сообщение
git show -s --format=%B <hash>
git show
— это «лупа» для одного коммита: кто автор, какие файлы затронуты, какие строки изменены. Умение быстро читать такие диффы экономит часы на ревью и отладке.
2.3 Изменение последнего коммита: --amend
# Добавить забытые файлы в предыдущий коммит
git add src/missed.py
git commit --amend --no-edit
# Изменить сообщение последнего коммита
git commit --amend -m "fix: корректирует обработку ошибок"
--amend
переписывает заголовок истории, создавая новый коммит вместо старого. Это безопасно локально, но опасно для уже опубликованных веток: чужие репозитории потеряют ссылочную целостность.
Важно: не амендьте коммиты, которые уже ушли на общий remote.
2.4 Интерактивное добавление: git add -p
Позволяет выбрать части файла (hunks) для включения в коммит, делая коммиты «цельными».
git add -p
# Клавиши: y (принять), n (пропустить), e (редактировать), s (разбить), q (выход)
Мыслите «единицами смысла»: отдельный фикс — отдельный коммит. Интерактивное добавление помогает отделить косметику от логики, а эксперимент — от результата.
2.5 Игнорирование файлов: .gitignore
# .gitignore
__pycache__/
*.log
.env
build/
Шаблоны в .gitignore
работают на уровне путей и масок. Для локальных исключений используйте .git/info/exclude
. Не добавляйте в историю артефакты сборки и секреты — это усложняет ревью и раздувает репозиторий.
2.6 Анатомия коммита
Коммит содержит: ссылку на дерево (snapshot), одного или нескольких родителей, автора и коммиттера (имя, email, время), сообщение. Идентификатор коммита — хеш содержимого объекта.
2.8 Сообщения коммитов и трейлеры
Помимо заголовка и описания, сообщения могут включать «трейлеры»: Co-authored-by:
, Signed-off-by:
, Refs:
. Они машинно‑читаемы и поддерживаются инструментами.
2.9 Диапазоны и селекторы в истории
Выражения диапазонов позволяют адресовать подмножества истории: A..B
(что в B, но нет в A), A...B
(симметричная разность), каретки и тильды для родителей (HEAD^
, HEAD~2
), селекторы по датам и авторам.
2.10 Продвинутые опции diff/log
Опции: --word-diff
(покомпонентные изменения), --find-renames
/--find-copies
(эвристики переименований/копий), игнорирование пробелов (-w
), цвет и форматирование.
2.11 Поиск изменений: pickaxe и pathspec
Pickaxe (-S
) ищет коммиты, добавляющие/удаляющие строку/подстроку. Pathspec задаёт шаблоны путей, позволяет гибко ограничивать область анализа.
2.12 Форматы вывода и кастомизация
git log --pretty=<format>
предоставляет гибкую настройку полей (хеш, дата, автор, тема). Комбинация с --decorate
, --graph
делает ленту истории информативной.