git add
Подробная информация о команде git add: принцип работы, примеры, параметры, интерактивный режим и редактирование патчей.
Описание
Команда git add переносит изменения из рабочего каталога в область индексирования (также называемую индексом). С её помощью вы указываете Git, какие изменения файлов войдут в следующий коммит. Сама по себе git add не сохраняет ничего в историю — она лишь помечает изменения как готовые к фиксации. Чтобы фактически их записать, после этого нужно выполнить git commit. Чтобы в любой момент посмотреть, что уже проиндексировано, а что нет, используйте git status.
На этой странице рассматривается, что делает git add, три «области» Git, между которыми она находится, наиболее полезные параметры, а также интерактивный режим и режим редактирования патчей для пошагового индексирования изменений.

Три области
Каждое изменение в Git-проекте проходит через три области:
- Рабочий каталог — файлы, которые вы непосредственно редактируете на диске.
- Область индексирования (индекс) — снимок того, что войдёт в следующий коммит.
- Репозиторий — зафиксированная история, которую записывает git commit.
git add перемещает изменения из рабочего каталога в область индексирования. Затем git commit записывает всё проиндексированное в репозиторий. Именно эта двухшаговая схема позволяет разбить беспорядочный рабочий каталог на чистые, логически завершённые коммиты.
Зачем вообще индексировать изменения?
Во многих системах контроля версий коммит захватывает снимок всего изменённого. Git намеренно добавляет промежуточную область индексирования, чтобы вы могли решить, что именно входит в каждый коммит. Это удобно, когда вы одновременно редактировали несколько несвязанных вещей: можно проиндексировать и зафиксировать одно логическое изменение, затем проиндексировать и зафиксировать следующее, сохраняя историю читабельной.
Поскольку индексирование фиксирует снимок в момент запуска команды, git add нужно выполнять повторно каждый раз, когда вы делаете дальнейшие правки, которые хотите включить. Если вы проиндексировали файл и продолжили его редактировать, более поздние правки остаются непроиндексированными до следующего git add.
Основные параметры
Проиндексировать один файл для следующего коммита:
git add <file>Проиндексировать все изменения внутри каталога (рекурсивно, включая новые файлы):
git add <directory>Проиндексировать все изменения в репозитории — новые, изменённые и удалённые файлы:
git add -AПроиндексировать изменения только в уже отслеживаемых файлах, включая удаления, но игнорировать новые неотслеживаемые файлы:
git add -uПроиндексировать изменения в интерактивном режиме, выбирая фрагменты файлов по одному хангу:
git add -pgit add . vs git add -A vs git add -u
Эти три варианта легко перепутать, поэтому стоит разобраться точнее:
| Команда | Новые файлы | Изменённые файлы | Удалённые файлы | Область |
|---|---|---|---|---|
git add . | да | да | да | текущий каталог и вложенные |
git add -A | да | да | да | весь репозиторий |
git add -u | нет | да | да | только отслеживаемые файлы |
В современных версиях Git git add . и git add -A оба индексируют удаления; разница лишь в области применения. Используйте -u, если создали временные файлы, которые не должны попасть в коммит, и не хотите перечислять их в .gitignore.
Примеры git add
Эти команды можно запустить в любом Git-репозитории. Начните с проверки текущего состояния через git status, затем проиндексируйте и зафиксируйте изменения.
Проиндексировать новый файл
git add hello.pyПроиндексировать несколько конкретных файлов одновременно
git add hello.py utils.py README.mdПроиндексировать всё и зафиксировать с сообщением
git add -A
git commit -m "Add greeting script"Посмотреть, что проиндексировано перед коммитом
git statusOn branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: hello.pyЧтобы убрать файл из области индексирования, не теряя правок, используйте git restore --staged (или в старых версиях Git — git reset):
git restore --staged hello.pyИнтерактивный режим
Запуск git add -p (или выбор варианта patch в git add -i) начинает интерактивный сеанс индексирования. Git показывает один ханг — блок изменённых строк — за раз и предлагает выбрать команду. Наиболее частые ответы:
y— проиндексировать этот хангn— не индексировать этот хангq— выйти; не индексировать этот и все оставшиеся хангиa— проиндексировать этот ханг и все последующие в файлеd— не индексировать этот ханг и все последующие в файлеg— выбрать ханг для перехода/— поиск ханга, соответствующего заданному регулярному выражениюj— оставить этот ханг нерешённым, перейти к следующему нерешённому хангуJ— оставить этот ханг нерешённым, перейти к следующему хангуk— оставить этот ханг нерешённым, перейти к предыдущему нерешённому хангуK— оставить этот ханг нерешённым, перейти к предыдущему хангуs— разбить текущий ханг на меньшие хангиe— вручную отредактировать текущий ханг?— вывести справку
Разбиение (s) особенно удобно: если Git представляет две несвязанные правки как один ханг, s разбивает его, позволяя проиндексировать только нужную часть. Это стандартный способ создать чистый коммит из файла со смешанными изменениями.
Редактирование патчей
Вызов git add -e или выбор e в интерактивном выборщике чанков открывает патч в редакторе. После выхода из редактора результат применяется к индексу. Можно вносить произвольные изменения в патч, однако некоторые правки могут привести к сложному выводу или сделать патч неприменимым. Если вы хотите полностью отменить операцию, просто удалите все строки патча. Ниже перечислены распространённые элементы патча и допустимые операции с ними.
Строки, начинающиеся с +, представляют добавленное содержимое. Их можно удалить, чтобы не индексировать добавленные строки.
Строки, начинающиеся с -, представляют удалённое содержимое. Чтобы не индексировать их удаление, замените - на пробел ( ).
Изменённое содержимое отображается как строки с - (удаление старого содержимого), за которыми следуют строки с + (добавление нового). Чтобы не индексировать изменение, замените строки с - на пробелы и удалите строки с +. Обратите внимание: изменение только одной половины пары может привести к непредсказуемым изменениям в индексе.
Распространённые подводные камни
- Индексирование — это снимок, а не живая связь. Если вы выполнили
git addдля файла, а затем продолжили его редактировать, в индексе окажется только более ранняя версия. Запуститеgit addещё раз, чтобы включить новые правки — git status покажет один и тот же файл одновременно в разделах «Changes to be committed» и «Changes not staged for commit». git addне удаляет файлы за вас. Она индексирует удаления уже отслеживаемых файлов (с-Aили-u), но чтобы одновременно удалить файл с диска и проиндексировать это удаление, используйте git rm.- Игнорируемые файлы остаются игнорируемыми. Шаблоны в
.gitignoreне индексируются командойgit add .. Чтобы принудительно добавить игнорируемый файл, используйтеgit add -f <file>. - Ничего ещё не зафиксировано навсегда. Индексирование полностью обратимо. Используйте
git restore --staged <file>, чтобы отменить индексирование до коммита.