# Атомарный коммит _Ежедневная работа · GitLab Knowledge Base_ **TL;DR:** Коммит, который делает одну логически целостную правку. Каждый атомарный коммит можно безопасно revert'нуть, на каждом сборка и тесты проходят. Основа здоровой истории Git. «Атомарный» в контексте коммитов означает: одна порция изменений, одна тема, одна цель. Не «исправил баг + переименовал переменную + обновил react-router». ## Правила 1. **Одна логическая правка - один коммит.** Если в сообщении появляется «и», часто это два коммита. 2. **Сборка проходит на каждом коммите.** `git bisect` рассчитан на это. 3. **Коммит обратим через revert.** Без побочных эффектов. 4. **Без «WIP», «fix typo», «addresses comments»** в публичной истории. Это сжимается перед PR через [interactive-rebase](/courses/git/kb/interactive-rebase.md). ## Зачем - `git bisect` за `log(N)` шагов локализует регрессию. Если в истории «сломанные» коммиты - bisect путается. - `git revert ` чисто отменяет одну фичу. Если в коммите три темы - задеваются и невинные. - `git blame` помогает понять контекст изменения. Если коммит «допилил всё подряд» - контекста нет. - Code review намного быстрее. Один атомарный коммит - одна мысль для проверки. ## Что НЕ значит «атомарный» - **Не означает «маленький».** Большой рефакторинг с 30 файлами в одном коммите - нормально, если все правки на одну тему. - **Не означает «один файл».** Файл и логическая правка - разные оси. Одна тема может тронуть много файлов. - **Не означает «в один присест».** Атомарность - про итоговую форму коммита, не про процесс написания. Сначала пишешь как выходит, потом через [interactive-rebase](/courses/git/kb/interactive-rebase.md) и `git add -p` собираешь атомарные коммиты. ## Как разбить накопившуюся правку Самый быстрый способ - `git add -p`: ```bash 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 приходит один чистый коммит. ## Команды ```bash git add -p ``` Интерактивно по hunk'ам - главный инструмент атомарности ```bash git commit --fixup= ``` Создать коммит, который позже сольётся с указанным через autosquash rebase ```bash git rebase -i --autosquash main ``` Авто-применить все fixup-коммиты ## См. также - [git commit](/courses/git/kb/commit-cmd.md) - [git add](/courses/git/kb/add.md) - [Interactive rebase](/courses/git/kb/interactive-rebase.md) - [git commit --amend](/courses/git/kb/amend.md)