Модуль 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 делает ленту истории информативной.