Три состояния файлов в git

Главная ментальная модель git: как файл «путешествует» от правки до коммита через три области.

В git файл всегда находится в одном из состояний и проходит через три области: рабочая директорияиндексрепозиторий.

Три области git

Это самая важная идея во всём курсе. Если вы поймёте её сейчас, дальше будет легко.

ОбластьЧто это
Рабочая директория (working directory)Файлы, которые вы видите и редактируете прямо сейчас.
Индекс (staging area / index)«Корзина» для изменений, которые войдут в следующий коммит.
Репозиторий (.git)Зафиксированная история — все сделанные коммиты.

Зачем нужен индекс

Индекс — самая необычная для новичков часть. Зачем нужна промежуточная «корзина»? Затем, что он позволяет собирать коммит вручную. Допустим, вы поправили пять файлов, но логически это две разные задачи. Вы можете добавить в индекс только три файла, сделать осмысленный коммит, а потом добавить оставшиеся два и сделать второй коммит. История получится аккуратной.

Состояния файла

Относительно git каждый файл бывает:

  • Untracked — git его ещё не отслеживает (новый файл).
  • Modified — отслеживается и изменён, но изменения ещё не в индексе.
  • Staged — изменения добавлены в индекс и попадут в следующий коммит.
  • Committed / unmodified — изменения сохранены в репозитории, файл совпадает с последним коммитом.

Путь файла на практике

Посмотрим, как файл проходит весь путь. Создадим его, добавим в индекс и закоммитим:

echo "Hello" > readme.txt   # файл untracked в рабочей директории
git add readme.txt          # переносим в индекс -> staged
git commit -m "Add readme"  # фиксируем в репозитории -> committed

Команды-переходы между областями:

ПереходКоманда
рабочая директория → индексgit add
индекс → репозиторийgit commit
индекс → рабочая директория (убрать из индекса)git restore --staged

Зачем это знание новичку

Большинство ошибок начинающих с git растут из непонимания этих трёх областей. «Почему мои изменения не попали в коммит?» — потому что вы не добавили их в индекс. «Почему git показывает файл как изменённый после add?» — потому что вы поправили его уже после добавления в индекс, и в рабочей директории появилась новая версия. Держите картину трёх областей в голове, и поведение git перестанет казаться загадочным.

Аналогия с посылкой

Удобная метафора: рабочая директория — это ваш стол, где вы складываете вещи. Индекс — открытая коробка, в которую вы кладёте именно то, что хотите отправить. Коммит — момент, когда коробку заклеили и отправили: содержимое зафиксировано навсегда. git add кладёт вещь в коробку, git commit — заклеивает и отправляет её в архив истории.

Итог

  • Три области: рабочая директория, индекс (staging), репозиторий.
  • Индекс позволяет собирать коммит вручную и группировать изменения логически.
  • git add переносит изменения в индекс, git commit — в репозиторий.
Проверьте себя
1. В каком порядке файл проходит области git при сохранении изменений?
AРепозиторий → индекс → рабочая директория
BРабочая директория → индекс → репозиторий
CИндекс → рабочая директория → репозиторий
DРабочая директория → репозиторий → индекс
2. Для чего нужен индекс (staging area)?
AЧтобы хранить пароли git
BЧтобы вручную собирать содержимое следующего коммита
CЧтобы удалять файлы навсегда
DЭто копия удалённого сервера
3. В каком состоянии находится новый файл, о котором git ещё ничего не знает?
AStaged
BCommitted
CUntracked
DModified
Поддержать проект