W3docs

git add

Подробная информация о команде git add: принцип работы, примеры, параметры, интерактивный режим и редактирование патчей.

Описание

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

На этой странице рассматривается, что делает git add, три «области» Git, между которыми она находится, наиболее полезные параметры, а также интерактивный режим и режим редактирования патчей для пошагового индексирования изменений.

gitadd

Три области

Каждое изменение в 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 -p

git 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 status
On 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>, чтобы отменить индексирование до коммита.

Практика

Практика
Каковы возможности и параметры команды 'git add'?
Каковы возможности и параметры команды 'git add'?
Was this page helpful?