«Атомарный» в контексте коммитов означает: одна порция изменений, одна тема, одна цель. Не «исправил баг + переименовал переменную + обновил react-router».
Правила
- Одна логическая правка - один коммит. Если в сообщении появляется «и», часто это два коммита.
- Сборка проходит на каждом коммите.
git bisectрассчитан на это. - Коммит обратим через revert. Без побочных эффектов.
- Без «WIP», «fix typo», «addresses comments» в публичной истории. Это сжимается перед PR через interactive-rebase.
Зачем
git bisectзаlog(N)шагов локализует регрессию. Если в истории «сломанные» коммиты - bisect путается.git revert <sha>чисто отменяет одну фичу. Если в коммите три темы - задеваются и невинные.git blameпомогает понять контекст изменения. Если коммит «допилил всё подряд» - контекста нет.- Code review намного быстрее. Один атомарный коммит - одна мысль для проверки.
Что НЕ значит «атомарный»
- Не означает «маленький». Большой рефакторинг с 30 файлами
в одном коммите - нормально, если все правки на одну тему.
- Не означает «один файл». Файл и логическая правка - разные оси. Одна тема может тронуть много файлов.
- Не означает «в один присест». Атомарность - про итоговую
форму коммита, не про процесс написания. Сначала пишешь как
выходит, потом через interactive-rebase и
git add -pсобираешь атомарные коммиты.
Как разбить накопившуюся правку
Самый быстрый способ - git add -p:
git add -p src/auth/
git commit -m "feat(auth): add OAuth provider"
git add -p src/billing/
git commit -m "fix(billing): handle null currency"
git add -p src/utils/
git commit -m "refactor(utils): extract date helpers"
По hunk'ам выбираешь, что войдёт в текущий коммит. Остальное - в следующие.
Если правки переплетены внутри файла - Git разделит на hunk'и
автоматически. Если не угадал - s (split) или e (edit) в
патч-режиме.
Подводные камни
- Перфекционизм мешает. Атомарность - это удобство, не религия. Если разделение займёт час ради одного фикса - не разделяй. Бери здравый смысл.
- Атомарность ≠ много мелких коммитов. Десять
pick / squash / fixupв reflog - нормальная форма работы. На main приходит один чистый коммит.