↓Перейти к содержанию
  1. Git: руководства и команды/

git add: как добавлять файлы в staging area (индекс)

·6 минут·

Команда 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: полное руководство по фиксации изменений».