урок 3 из 10

Хороший коммит

Делать коммиты по одному законченному изменению, писать сообщение из первой строки «что» и пояснения «зачем», вести .gitignore и не пускать в историю секреты и большие файлы.

8 мин чтения · 4 главы ·5 заданий ·домашняя работа

Одно законченное изменение

Первое правило курса: коммит — одно законченное изменение с понятным сообщением. В этом уроке разберём, что это значит на деле.

Одно изменение — это одна мысль: исправлена ошибка в расчёте, добавлена страница, переименована функция. Не «всё, что сделал за день». Почему это важно:

  • понятно — через месяц по истории видно, что и когда менялось;
  • легко откатить — если исправление оказалось неудачным, его убирают одним действием, не задевая соседних правок;
  • легко найти причину — когда что-то сломалось, маленький коммит показывает виновное изменение сразу, а большой — прячет его среди сотни строк;
  • легко проверить — коллега читает двадцать строк за минуту, а пятьсот не читает вовсе.

Законченное — значит проект после коммита в рабочем состоянии: собирается, запускается, не падает. Промежуточные «сохранился на полпути» полезны вам, но мешают всем, кто будет искать причину ошибки: на таком коммите проект просто не работает.

Как понять, что пора коммитить? Простой признак: если вы можете описать сделанное одной строкой без слова «и» — пора. «Исправить расчёт скидки и поменять цвет кнопки и обновить зависимости» — это три коммита.

Сообщение

Вторая половина правила — понятное сообщение. Сообщение читают люди: вы через полгода, коллега на ревью, новичок, который разбирается, почему код такой.

Устройство сообщения, принятое почти везде:

  • первая строка — что делает коммит, коротко, примерно до пятидесяти знаков. Её видно в git log --oneline и в списках на сервисе;
  • пустая строка — отделяет заголовок от пояснения, это Git понимает;
  • пояснение — зачем: что было не так, почему решили именно так, что стоит знать. Не пересказ кода — код видно в диффе.

Первую строку удобно писать как команду: «Исправить расчёт скидки», «Добавить страницу контактов». Её легко читать как продолжение фразы «если применить этот коммит, он…».

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

.gitignore

Не всё, что лежит в папке проекта, должно попасть в репозиторий. В истории нужно то, что пишут люди и что нужно всем. Лишнее — это:

  • то, что собирается само: результаты сборки, сжатые файлы, скомпилированный код;
  • зависимости — чужие библиотеки, которые скачиваются по списку (например, папка node_modules);
  • личное: настройки вашего редактора, служебные файлы системы;
  • журналы и временные файлы;
  • секреты — пароли, ключи, файлы с настройками доступа.
Код, тексты,настройкипроекта.gitignore:фильтрСборка, логи,зависимости,секретыпервое — в историю · последнее — остаётся только у вас
В репозитории — то, что пишут люди и что нужно всем. Всё, что собирается само, у каждого своё или секретно, перечисляют в .gitignore, и Git перестаёт это замечать.

Чтобы Git перестал замечать лишнее, его перечисляют в файле .gitignore в корне проекта:

# зависимости и сборка
node_modules/
dist/

# журналы
*.log

# секреты и личные настройки
.env
.vscode/

Файл .gitignore сам коммитят в репозиторий: правила общие для всех, кто работает с проектом. Для большинства языков и инструментов есть готовые шаблоны — начинать с них удобнее, чем вспоминать всё самому.

Секреты и большие файлы

Два вида файлов в репозитории особенно опасны.

Секреты. Пароль от базы, ключ доступа к платёжному сервису, токен бота. Попав в коммит, секрет остаётся в истории навсегда — даже если в следующем коммите его удалить. Любой, у кого есть копия репозитория, найдёт его в прошлых коммитах. А если репозиторий открытый, такие ключи находят автоматические программы, которые специально ищут их в свежих коммитах.

Где держать секреты? Вне репозитория: в переменных окружения, в отдельном файле вроде .env, указанном в .gitignore, в хранилище секретов, если оно есть в команде. В репозиторий кладут только пример без настоящих значений — например, .env.example с пустыми полями, чтобы коллега знал, что заполнить.

Большие файлы. Видео, архивы, выгрузки баз, тяжёлые картинки. История хранит каждую версию каждого файла, и удалить большой файл из прошлого нельзя, не переписав её. Один случайно закоммиченный архив на гигабайт делает каждый git clone на гигабайт тяжелее — для всех и навсегда.

Защита от обеих бед одна — третье правило курса: смотри, что отправляешь. git status покажет неожиданный файл, git diff --staged — строку с ключом. Полминуты перед коммитом дешевле любого спасения после.

Задания урока

Каждое проверяется сразу: ответ сверяется с эталоном, и на неверный вариант приходит разбор.

  1. Заполните пропуски.средне
  2. Разложите сообщения коммитов: понятное или нет.легко
  3. Расставьте части сообщения коммита.средне
  4. Что обычно перечисляют в .gitignore?средне
  5. Если удалить пароль из файла следующим коммитом, он исчезнет из репозитория.средне
Пройти урок с проверкой заданий Курс «Git и работа в команде» открыт и бесплатен, прогресс сохраняется.
Открыть курс