git add: как добавлять файлы в staging area (индекс)
Команда git add подготавливает файлы для включения в коммит, добавляя их в специальную промежуточную область — staging area (индекс). Понимание этой команды критично для работы с Git, потому что именно она контролирует, какие изменения попадут в следующий снимок истории.
Что такое staging area (индекс) #
В Git существует три области:
Рабочая директория Индекс (Staging Area) Репозиторий
(Working Directory) → (Index) → (Repository)
git add git commit
Рабочая директория — это папка с вашими файлами. Здесь вы редактируете код.
Индекс (staging area) — промежуточная зона, где вы собираете изменения перед коммитом. git add перемещает изменения сюда.
Репозиторий — постоянная история коммитов. git commit переносит содержимое индекса в репозиторий.
Зачем нужна эта промежуточная зона? Она даёт гибкость: вы можете изменить десять файлов, но закоммитить только пять — те, которые относятся к одной логической задаче. Это позволяет создавать чистую, понятную историю.
Основные варианты git add #
Добавить конкретный файл #
git add index.js
git add styles/main.css
git add "path/to/my file.txt" # Кавычки для файлов с пробелами
Добавить несколько файлов #
git add файл1.js файл2.js файл3.js
Добавить все изменения в текущей папке #
git add .
Добавляет все изменённые и новые файлы в текущей директории и её подпапках.
Добавить все изменения в репозитории #
git add -A
# или
git add --all
Добавляет всё: изменённые, новые и удалённые файлы, независимо от текущей директории.
Добавить только изменённые файлы (не новые) #
git add -u
# или
git add --update
Обновляет индекс для уже отслеживаемых файлов. Новые (untracked) файлы не добавляются.
Жизненный цикл файла в Git #
Новый файл
(Untracked)
↓ git add
Подготовлен к коммиту
(Staged)
↓ git commit
Зафиксирован в репозитории
(Committed)
↓ редактирование
Изменён
(Modified)
↓ git add
Подготовлен к коммиту
(Staged)
Посмотреть текущее состояние файлов:
git status
# Пример вывода:
# Changes to be committed: ← в индексе (staged)
# new file: index.js
# modified: styles.css
#
# Changes not staged for commit: ← изменены, но не в индексе
# modified: README.md
#
# Untracked files: ← новые файлы, Git не отслеживает
# package.json
Проверка того, что в индексе #
Перед коммитом проверьте, что именно подготовлено:
# Посмотреть все изменения
git status
# Посмотреть diff файлов В индексе (staged changes)
git diff --staged
# или
git diff --cached
# Посмотреть diff файлов НЕ в индексе (unstaged changes)
git diff
Разница между git diff и git diff --staged:
git diff— что изменилось, но ещё не добавлено в индексgit diff --staged— что уже в индексе и войдёт в следующий коммит
Частичное добавление файла (git add -p) #
Если в файле несколько логически разных изменений, можно добавить их по отдельности:
git add -p
# или
git add --patch
Git покажет каждый «кусок» (hunk) изменений и спросит, что с ним делать:
@@ -1,5 +1,7 @@
function hello() {
+ console.log("hello world");
return "hello";
}
Stage this hunk [y,n,q,a,d,s,?]?
Варианты ответа:
y— добавить этот hunk в индексn— пропуститьs— разделить на более мелкие частиq— выйти?— справка
Это мощный инструмент для создания чистых коммитов с одной логической задачей на каждый.
Интерактивный режим #
git add -i
Открывает интерактивное меню для управления staging area. Удобно для сложных операций с несколькими файлами.
Добавление удалённых файлов #
Если вы удалили файл через rm (а не git rm), нужно зафиксировать удаление в индексе:
# Удаление файла из файловой системы
rm old_file.js
# git status покажет файл как "deleted"
# Добавить удаление в индекс
git add old_file.js
# Или добавить все изменения включая удаления
git add -A
Правильнее сразу использовать git rm:
git rm old_file.js
# Файл удалён и сразу добавлен в индекс
Работа с .gitignore #
git add . не добавит файлы из .gitignore. Если по какой-то причине нужно принудительно добавить игнорируемый файл:
git add -f debug.log
# -f или --force игнорирует .gitignore
Делайте это с осторожностью — обычно если файл в .gitignore, на то есть причина.
Подробнее о .gitignore в статье «.gitignore: полное руководство».
Удаление файла из индекса #
Если вы добавили файл ошибочно:
# Убрать файл из staging area (изменения останутся в рабочей директории)
git restore --staged файл.js
# Старый синтаксис (тоже работает)
git reset файл.js
git reset HEAD файл.js
После этого файл вернётся в статус «Modified» или «Untracked» — изменения в рабочей директории сохранятся.
Типичный рабочий процесс #
# 1. Редактируете файлы в IDE или редакторе
# 2. Проверяете статус
git status
# 3. Просматриваете изменения
git diff
# 4. Добавляете нужные файлы
git add index.js
git add styles/main.css
# 5. Проверяете, что добавлено правильно
git diff --staged
# 6. Создаёте коммит
git commit -m "feat: добавлена форма авторизации"
# 7. Проверяете результат
git log --oneline
Разница между git add . и git add -A #
Это частый вопрос:
| Команда | Новые файлы | Изменённые | Удалённые | Область действия |
|---|---|---|---|---|
git add . | ✓ | ✓ | ✓ (в Git 2.x) | Текущая папка и подпапки |
git add -A | ✓ | ✓ | ✓ | Весь репозиторий |
git add -u | ✗ | ✓ | ✓ | Весь репозиторий |
В Git версии 2.x разница между git add . и git add -A минимальна — оба обрабатывают удалённые файлы. В более старых версиях git add . не обрабатывал удалённые файлы.
Практический пример #
# Создаём проект
mkdir webapp && cd webapp
git init
# Создаём файлы
echo "<!DOCTYPE html>" > index.html
echo "body { margin: 0; }" > style.css
echo "console.log('app');" > app.js
# Проверяем статус (все файлы untracked)
git status
# Добавляем конкретные файлы
git add index.html style.css
# Проверяем — app.js всё ещё untracked
git status
# Первый коммит
git commit -m "feat: add HTML and CSS"
# Добавляем app.js
git add app.js
git commit -m "feat: add main JS file"
# Редактируем несколько файлов
echo "<h1>Hello</h1>" >> index.html
echo "h1 { color: blue; }" >> style.css
echo "console.log('updated');" >> app.js
# Добавляем только HTML и CSS, JS пока не готов
git add index.html style.css
git diff --staged # Проверяем что в индексе
# Коммитим
git commit -m "style: add heading and blue color"
# Теперь добавляем JS
git add app.js
git commit -m "feat: update JS console log"
Часто задаваемые вопросы #
Зачем нужен git add если есть git commit? Staging area даёт контроль: вы можете изменить много файлов, но закоммитить только логически связанные. Это ключ к чистой истории проекта.
Что будет, если я не запущу git add? git commit закоммитит только файлы, которые уже в индексе. Новые или изменённые файлы без git add не попадут в коммит (кроме случая git commit -a).
Можно ли добавить только часть файла? Да, используйте git add -p. Git покажет каждое изменение и спросит, добавлять ли его.
В чём разница между git add . и git add -A? В современном Git (2.x) они ведут себя одинаково для большинства случаев. git add -A применяется ко всему репозиторию независимо от текущей папки.
Как убрать файл из staging area? Используйте git restore --staged <файл>. Изменения в рабочей директории останутся нетронутыми.
Заключение #
git add — это не просто «добавить файл». Это инструмент для формирования осмысленных коммитов. Используйте его вдумчиво: добавляйте только те изменения, которые относятся к одной задаче, используйте git add -p для частичного добавления файлов и всегда проверяйте индекс через git diff --staged перед коммитом.
Следующий шаг — освоить «git commit: полное руководство по фиксации изменений».