Основной цикл — add, commit, status
Основной цикл git — правка, затем индексирование, затем коммит. git status показывает отслеживаемые и неотслеживаемые файлы; git add выбирает, что войдёт в коммит; git commit -m записывает это. Разбираем область индекса, git add . против явных путей и сокращение -am с подвохом.
Ты изменил пять файлов, но в этот коммит должны попасть только два — остальные три недоделанные эксперименты. В большинстве систем «сохранения» у тебя не было бы выбора: сохраняется всё разом. Git устроен иначе. Он ставит намеренный зазор между изменением файла и его записью, и этот зазор — самая важная привычка в повседневной работе с git.
К концу этого урока ты сможешь выполнять повседневный цикл — правка, git add, git commit, — уверенно читать git status и индексировать ровно те изменения, что задумал, а не всё подряд.
После этого урока ты сможешь описать цикл правка → индекс → коммит, объяснить разницу между отслеживаемыми и неотслеживаемыми файлами и роль области индекса, а также использовать git status, git add и git commit -m, чтобы записать выбранное подмножество своих изменений.
Каждое записываемое изменение проходит через три места: рабочее дерево, область индекса и репозиторий. Рабочее дерево — это твои файлы, как они лежат на диске прямо сейчас. Репозиторий — это закоммиченная история в .git. Между ними находится область индекса (она же index) — зона ожидания, где ты собираешь точное содержимое следующего коммита. git add копирует изменение из рабочего дерева в область индекса; git commit записывает то, что проиндексировано, как новый коммит. Ничего не записывается, пока ты не сделаешь коммит, и записывается лишь то, что ты проиндексировал.
git status — команда, которую ты запускаешь постоянно, чтобы видеть состояние каждого файла. Она группирует файлы в три корзины:
git status- Untracked (неотслеживаемые) — файлы, о которых git ничего не сказали. Совсем новые файлы начинают здесь.
- Changes not staged for commit (изменения не проиндексированы) — отслеживаемые файлы, которые ты правил, но ещё не сделал
add. - Changes to be committed (изменения для коммита) — то, что сейчас в области индекса, готово к записи.
Отслеживаемый файл — это тот, о котором git уже знает по прошлому коммиту или git add; неотслеживаемый файл существует на диске, но ещё не под контролем версий. Запускай git status перед каждым коммитом, чтобы случайно ничего не записать.
git add индексирует изменения — и ты сам решаешь, сколько именно. Можно проиндексировать один файл, несколько или всё:
git add src/login.js # проиндексировать один конкретный файл
git add src/login.js README.md # несколько явных путей
git add . # все изменения в текущем каталогеgit add . удобен, но грубоват: он индексирует все изменения — включая новые файлы и недоделанные правки — под твоим текущим путём. Для сфокусированного коммита явные пути не пускают мусор в историю. Индексирование подмножества — и есть весь смысл index: ты решаешь, какие из пяти изменённых файлов станут этим коммитом.
git commit записывает проиндексированный снимок, а сообщение объясняет, зачем. Флаг -m задаёт сообщение прямо в строке:
git commit -m "Add login form validation"Это коммитит только то, что проиндексировано — непроиндексированные эксперименты остаются в рабочем дереве нетронутыми, для будущего коммита. После коммита git status показывает чистое дерево для записанных частей. Затем цикл повторяется: правка, git add, git commit.
▸Граничные случаи
Есть сокращение git commit -am "msg", которое индексирует и коммитит за один шаг, — но внимательно прочитай оговорку. Флаг -a автоматически индексирует только файлы, которые git уже отслеживает. Совсем новые (неотслеживаемые) файлы пропускаются полностью. Так что git commit -am после создания newfile.js молча оставит этот файл вне коммита. Это удобно для быстрых правок существующих файлов, но если речь о новых файлах — сначала проиндексируй их явно через git add и проверь git status.
Записываем два изменения из пяти.
Ты правил login.js и signup.js (настоящее исправление бага) плюс notes.txt, а ещё создал два черновых файла tmp1.js и tmp2.js, которые пока не готов хранить. git status показывает login.js, signup.js, notes.txt как не проиндексированные изменения, а tmp1.js, tmp2.js — как неотслеживаемые.
Тебе нужно в этом коммите только исправление бага:
git add login.js signup.js
git status # подтверждает, что лишь эти два «для коммита»
git commit -m "Fix null check in login and signup flows"Коммит содержит ровно два файла. notes.txt и оба черновика нетронуты в рабочем дереве, ждут отдельных, более чистых коммитов позже. Набери ты git add . — все пять были бы проиндексированы, черновики попали бы в историю, и следующие минуты ушли бы на распутывание.
▸Почему это работает
Зачем вообще область индекса — почему не коммитить всё изменённое? Потому что реальная работа грязная: за один сеанс правок ты чинишь баг, переименовываешь переменную и оставляешь TODO. Index позволяет нарезать эту кашу на чистые, односмысловые коммиты — проиндексировал баг-фикс, закоммитил, проиндексировал переименование, закоммитил. Ревьюер, читая твою историю позже, видит три намеренных изменения вместо одного спутанного кома. git add -p идёт дальше, позволяя индексировать отдельные куски (hunks) внутри одного файла интерактивно; ты воспользуешься этим, когда коммиты станут тесными.
Ты создал новый файл auth.js, затем выполнил git commit -am 'Add auth'. Что произойдёт?
Повседневный цикл git — это правка → git add → git commit, с постоянным чтением git status между ними. Область индекса — это зона ожидания, где ты собираешь следующий коммит, поэтому git отделяет изменение файла от его записи. Отслеживаемые файлы git уже знает; неотслеживаемые новые и должны быть add-нуты перед коммитом. git add <пути> индексирует выбранное подмножество; git add . индексирует всё под текущим путём; git commit -m записывает только проиндексированное. Сокращение -am удобно, но молча пропускает неотслеживаемые файлы. Дальше ты научишься читать, что именно изменил, — git diff и git log, — прежде чем коммитить.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.