Команды add и commit. Добавление изменений и выполнение коммитов в Git

Если в каталоге проекта появляются новые файлы, то Git их "увидит". Однако это не означает, что он их автоматически "проиндексирует" и начнет следить за изменением содержимого файлов. В выводе git status такие файлы и папки находятся в секции неотслеживаемых (untracked):

$ git status
Текущая ветка: master

Еще нет коммитов

Неотслеживаемые файлы:
  (используйте «git add <файл>...», чтобы добавить в то, что будет включено в коммит)
  docs/
  program.py
  readme.md

индекс пуст, но есть неотслеживаемые файлы
 (используйте «git add», чтобы проиндексировать их)

Чтобы Git начал следить за новыми файлами, ему надо указать это явно с помощью команды git add. В качестве параметров передаются адреса/имена файлов или Glob-шаблоны. Если добавляется папка, команда рекурсивно добавит в индекс все файлы из указанного каталога. Также можно указать ключ --all или точку, и тогда в индекс будут отправлены все неотслеживаемые объекты проекта или текущего каталога.

$ git add program.py readme.md 
$ git status
Текущая ветка: master

Еще нет коммитов

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>...», чтобы убрать из индекса)
  новый файл:    program.py
  новый файл:    readme.md

Неотслеживаемые файлы:
  (используйте «git add <файл>...», чтобы добавить в то, что будет включено в коммит)
  docs/

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

Коммиты выполняются с помощью команды git commit, после которой указывают ключ -m и в кавычках пишут небольшой комментарий о том, какие изменения были внесены.

$ git commit -m "Создан главный файл приложения и readme.md"
[master (корневой коммит) 0fd6402] Создан главный файл приложения и readme.md
 2 files changed, 2 insertions(+)
 create mode 100644 program.py
 create mode 100644 readme.md
$ git status
Текущая ветка: master
Неотслеживаемые файлы:
  (используйте «git add <файл>...», чтобы добавить в то, что будет включено в коммит)
  docs/

индекс пуст, но есть неотслеживаемые файлы
 (используйте «git add», чтобы проиндексировать их)
$ git log
commit 0fd6402ad98aad3902f1813c2964e749d13adff0 (HEAD -> master)
Author: Ivan Ivanov <ivan@mail.com>
Date:   Thu May 29 15:53:06 2025 +0300

    Создан главный файл приложения и readme.md

Команда git log позволяет просматривать историю коммитов. Ключ -n (где n - число) - ограничивает вывод только последними коммитами в количестве n.

В примере выше каталог docs не был включен в коммит. Это означает, что если будет выполнено "копирование" (пуш) коммита на другой компьютер, этот каталог там не появится. Так делают, если этап разработки какой-либо части проекта еще не завершен, и не желательно распространять изменения в таком виде.

Если содержимое отслеживаемого файла меняется, Git "замечает" это. Однако, как и в случае с новыми файлами, автоматически не будет индексировать изменения для следующего коммита.

$ git status
Текущая ветка: master
Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>...», чтобы добавить файл в индекс)
  (используйте «git restore <файл>...», чтобы отменить изменения в рабочем каталоге)
  изменено:      program.py

Неотслеживаемые файлы:
  (используйте «git add <файл>...», чтобы добавить в то, что будет включено в коммит)
  docs/

индекс пуст (используйте «git add» и/или «git commit -a»)

Чтобы изменения "засчитались", надо снова дать команду git add.

$ git add .
$ git status
Текущая ветка: master
Изменения, которые будут включены в коммит:
  (используйте «git restore --staged <файл>...», чтобы убрать из индекса)
  новый файл:    docs/part1.txt
  изменено:      program.py

Можно сказать, что у команды add двойное назначение. С ее помощью происходит как добавление новых файловых объектов, так и индексирование изменений в отслеживаемых.

Таким образом, простой алгоритм одного цикла работы (от коммита до коммита) с git-репозиторием выглядит так:

  1. Вносятся изменения в проект: правятся имеющиеся файлы, добавляются/удаляются новые.
  2. С помощью git add выполняется индексирование тех изменений, которые должны быть учтены в предстоящем коммите.
  3. Командой git commit -m "Описание внесенных изменений" фиксируется новое состояние проекта.

Если все измененные отслеживаемые файлы должны быть добавлены в коммит (неотслеживаемых это не касается), то вместо одтельных git add и git commit можно дать "объединенную" команду, в которой вместо git add используется ключ -a у git commit.

$ git commit -am "Добавлена переменная в главный файл приложения"

Если из проекта удаляется файл, то это изменение также надо индесировать с помощью git add.

$ rm readme.md 
$ git status
Текущая ветка: master
Изменения, которые не в индексе для коммита:
  (используйте «git add/rm <файл>...», чтобы добавить или удалить файл из индекса)
  (используйте «git restore <файл>...», чтобы отменить изменения в рабочем каталоге)
  удалено:       readme.md

индекс пуст (используйте «git add» и/или «git commit -a»)

Пока коммит не сделан, удаленный файл можно восстановить. После коммита вы сможете "достать" его только из предыдущих стадий проекта.