linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/kb/Ежедневная работа/atomic-commit

kb/workflow ── Ежедневная работа ── intermediate

Атомарный коммит

Коммит, который делает одну логически целостную правку. Каждый атомарный коммит можно безопасно revert'нуть, на каждом сборка и тесты проходят. Основа здоровой истории Git.

view as markdownaka: atomic, small-commit

«Атомарный» в контексте коммитов означает: одна порция изменений, одна тема, одна цель. Не «исправил баг + переименовал переменную + обновил react-router».

Правила

  1. Одна логическая правка - один коммит. Если в сообщении появляется «и», часто это два коммита.
  2. Сборка проходит на каждом коммите. git bisect рассчитан на это.
  3. Коммит обратим через revert. Без побочных эффектов.
  4. Без «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:

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=<sha>

Создать коммит, который позже сольётся с указанным через autosquash rebase

bash
git rebase -i --autosquash main

Авто-применить все fixup-коммиты

§ см. также

  • commit-cmdgit commitФиксирует то, что лежит в индексе, как новый коммит-объект и передвигает текущую ветку на этот коммит. Без аргументов открывает редактор для сообщения; чаще всего вызывают с `-m`.
  • addgit addКоманда переносит изменения файлов из рабочего дерева в индекс (staging area). Сама ничего не коммитит - только готовит, что попадёт в следующий коммит.
  • interactive-rebaseInteractive rebase`git rebase -i <base>` открывает редактор со списком коммитов от `<base>` до HEAD, где можно переименовывать, объединять, удалять и переставлять их. Главный инструмент для очистки локальной истории.
  • amendgit commit --amendПереписывает последний коммит - меняет сообщение, подмешивает забытые правки, поправляет содержимое. Создаёт новый объект с новым SHA. Безопасен до push, опасен после.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки