# git add _Ежедневная работа · GitLab Knowledge Base_ **TL;DR:** Команда переносит изменения файлов из рабочего дерева в индекс (staging area). Сама ничего не коммитит - только готовит, что попадёт в следующий коммит. `git add` - самая частая команда в Git после `git status`. Она отвечает за переход «правки на диске» → «правки готовые к коммиту». ## Что делает под капотом Для каждого файла: 1. Считывает содержимое из рабочего дерева. 2. Создаёт [blob](/courses/git/kb/blob.md)-объект в `.git/objects/`. 3. Обновляет запись в `.git/index`: путь, права, SHA blob'а. После этого `git status` покажет файл в разделе «Changes to be committed». ## Базовые формы ```bash git add file.txt # один файл git add src/ # директория рекурсивно git add . # всё из текущей папки git add -A # все изменения по всему репозиторию git add '*.py' # по маске ``` Разница между `.` и `-A`: точка добавляет только из текущей рабочей директории, `-A` смотрит на весь репозиторий вне зависимости от того, где ты находишься. ## Интерактивный режим ```bash git add -p file.txt ``` Разбивает правку на hunk'и (куски ±3 строки контекста) и спрашивает по каждому: `y` - добавить, `n` - пропустить, `s` - разбить на более мелкие, `e` - отредактировать вручную. Это главный инструмент для разделения одного файла с двумя разными изменениями на два коммита. ## Подводные камни - `git add file.txt` пишет в индекс *текущее* содержимое. Если после `add` ещё раз отредактировать файл - в индексе останется старая версия. `git status` покажет файл и в «to be committed», и в «not staged». Чтобы догнать - повторить `git add`. - Новые файлы по умолчанию **не отслеживаются**. Их видно как untracked, пока их явно не добавить. Регистрация автоматическая отсутствует - это сделано намеренно, чтобы случайные файлы (логи, билд-артефакты) не попадали в индекс. ## Команды ```bash git add file.txt ``` Добавить один файл в индекс ```bash git add -A ``` Добавить все изменения по репозиторию: новые, изменённые, удалённые ```bash git add -p ``` Интерактивно по hunk'ам ```bash git add -u ``` Только изменённые отслеживаемые файлы (без новых untracked) ## См. также - [git status](/courses/git/kb/status.md) - [git commit](/courses/git/kb/commit-cmd.md) - [Blob](/courses/git/kb/blob.md)