Одно законченное изменение
Первое правило курса: коммит — одно законченное изменение с понятным сообщением. В этом уроке разберём, что это значит на деле.
Одно изменение — это одна мысль: исправлена ошибка в расчёте, добавлена страница, переименована функция. Не «всё, что сделал за день». Почему это важно:
- понятно — через месяц по истории видно, что и когда менялось;
- легко откатить — если исправление оказалось неудачным, его убирают одним действием, не задевая соседних правок;
- легко найти причину — когда что-то сломалось, маленький коммит показывает виновное изменение сразу, а большой — прячет его среди сотни строк;
- легко проверить — коллега читает двадцать строк за минуту, а пятьсот не читает вовсе.
Законченное — значит проект после коммита в рабочем состоянии: собирается, запускается, не падает. Промежуточные «сохранился на полпути» полезны вам, но мешают всем, кто будет искать причину ошибки: на таком коммите проект просто не работает.
Как понять, что пора коммитить? Простой признак: если вы можете описать сделанное одной строкой без слова «и» — пора. «Исправить расчёт скидки и поменять цвет кнопки и обновить зависимости» — это три коммита.
Сообщение
Вторая половина правила — понятное сообщение. Сообщение читают люди: вы через полгода, коллега на ревью, новичок, который разбирается, почему код такой.
Устройство сообщения, принятое почти везде:
- первая строка — что делает коммит, коротко, примерно до пятидесяти знаков. Её видно в
git log --onelineи в списках на сервисе; - пустая строка — отделяет заголовок от пояснения, это Git понимает;
- пояснение — зачем: что было не так, почему решили именно так, что стоит знать. Не пересказ кода — код видно в диффе.
Первую строку удобно писать как команду: «Исправить расчёт скидки», «Добавить страницу контактов». Её легко читать как продолжение фразы «если применить этот коммит, он…».
Если в команде принят свой формат — например, в начале строки тип изменения или номер задачи, — пишите в нём. Единый формат делает историю ровной и позволяет искать по ней.
.gitignore
Не всё, что лежит в папке проекта, должно попасть в репозиторий. В истории нужно то, что пишут люди и что нужно всем. Лишнее — это:
- то, что собирается само: результаты сборки, сжатые файлы, скомпилированный код;
- зависимости — чужие библиотеки, которые скачиваются по списку (например, папка
node_modules); - личное: настройки вашего редактора, служебные файлы системы;
- журналы и временные файлы;
- секреты — пароли, ключи, файлы с настройками доступа.
Чтобы Git перестал замечать лишнее, его перечисляют в файле .gitignore в корне проекта:
# зависимости и сборка
node_modules/
dist/
# журналы
*.log
# секреты и личные настройки
.env
.vscode/
Файл .gitignore сам коммитят в репозиторий: правила общие для всех, кто работает с проектом. Для большинства языков и инструментов есть готовые шаблоны — начинать с них удобнее, чем вспоминать всё самому.
Секреты и большие файлы
Два вида файлов в репозитории особенно опасны.
Секреты. Пароль от базы, ключ доступа к платёжному сервису, токен бота. Попав в коммит, секрет остаётся в истории навсегда — даже если в следующем коммите его удалить. Любой, у кого есть копия репозитория, найдёт его в прошлых коммитах. А если репозиторий открытый, такие ключи находят автоматические программы, которые специально ищут их в свежих коммитах.
Где держать секреты? Вне репозитория: в переменных окружения, в отдельном файле вроде .env, указанном в .gitignore, в хранилище секретов, если оно есть в команде. В репозиторий кладут только пример без настоящих значений — например, .env.example с пустыми полями, чтобы коллега знал, что заполнить.
Большие файлы. Видео, архивы, выгрузки баз, тяжёлые картинки. История хранит каждую версию каждого файла, и удалить большой файл из прошлого нельзя, не переписав её. Один случайно закоммиченный архив на гигабайт делает каждый git clone на гигабайт тяжелее — для всех и навсегда.
Защита от обеих бед одна — третье правило курса: смотри, что отправляешь. git status покажет неожиданный файл, git diff --staged — строку с ключом. Полминуты перед коммитом дешевле любого спасения после.