НейроАгент

Git Add --all vs .: Полное руководство

Узнайте ключевые различия между командами git add --all и git add .. Понимайте, как они обрабатывают удаленные файлы, область действия каталогов и когда использовать каждую из них в вашем Git-рабочем процессе.

Вопрос

В чем разница между командами git add [--all | -A] и git add . в системе контроля версий Git?

НейроАгент

Основное различие между git add [--all | -A] и git add . заключается в том, что git add --all (или -A) добавляет все изменения, включая неотслеживаемые файлы, удаленные файлы и измененные файлы независимо от текущего каталога, в то время как git add . добавляет изменения только в текущем каталоге и его подкаталогах, исключая файлы, удаленные из рабочего каталога.


Содержание


Основы команд Git Add

Команда add в Git является фундаментальной для рабочего процесса контроля версий, отвечая за добавление изменений в индекс перед их коммитом в репозиторий. Хотя обе команды git add --all и git add . могут добавлять файлы, они работают по-разному в зависимости от области действия и поведения.

Базовые определения

  • git add --all (или ее сокращение git add -A): Добавляет все изменения во всем репозитории, включая:

    • Измененные файлы
    • Новые неотслеживаемые файлы
    • Удаленные файлы
    • Работает из любого каталога
  • git add .: Добавляет изменения только в текущем каталоге и его подкаталогах, включая:

    • Измененные файлы
    • Новые неотслеживаемые файлы
    • Исключает удаленные файлы из рабочего каталога

Детальное сравнение

Различия в области действия

Особенность git add --all / -A git add .
Область действия каталогов Весь репозиторий Текущий каталог и подкаталоги
Удаленные файлы ✅ Включает удаленные файлы ❌ Исключает удаленные файлы
Неотслеживаемые файлы ✅ Включает все неотслеживаемые файлы ✅ Включает неотслеживаемые файлы в области действия
Изменения файлов ✅ Включает все изменения ✅ Включает изменения в области действия
Зависимость от текущего каталога ❌ Работает из любого каталога ✅ Должна выполняться из целевого каталога

Различия в поведении

Наиболее критичное различие заключается в том, как эти команды обрабатывают удаленные файлы:

  • git add --all добавляет удаления в индекс, что означает, что файлы, удаленные из рабочего каталога, будут удалены из репозитория при коммите
  • git add . игнорирует удаленные файлы, поэтому при использовании этой команды вам потребуется использовать git rm, чтобы добавить удаления в индекс

Практические примеры

Настройка сценария

Рассмотрим структуру репозитория:

project/
├── file1.txt (изменен)
├── file2.txt (удален)
├── subdir/
│   ├── file3.txt (изменен)
│   └── file4.txt (новый)

Выполнение команд из корневого каталога проекта

bash
# Из корневого каталога проекта
git add --all          # Добавляет все изменения, включая удаление file2.txt
git add .              # Добавляет file1.txt, subdir/file3.txt, subdir/file4.txt
                        # НЕ добавляет удаление file2.txt

Выполнение команд из подкаталога

bash
# Из каталога project/subdir
git add --all          # Все равно добавляет все изменения, включая удаление file2.txt
git add .              # Добавляет только subdir/file3.txt и subdir/file4.txt
                        # НЕ добавляет file1.txt или удаление file2.txt

Визуальное представление

Перед добавлением в индекс:

$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file1.txt
        modified:   subdir/file3.txt
        new file:   subdir/file4.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   file2.txt
        deleted:    file2.txt

После git add --all:

$ git add --all
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file1.txt
        deleted:    file2.txt
        modified:   subdir/file3.txt
        new file:   subdir/file4.txt

После git add . (из корня):

$ git add .
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file1.txt
        modified:   subdir/file3.txt
        new file:   subdir/file4.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    file2.txt

Когда использовать каждую команду

Используйте git add --all, когда:

  • Вы хотите добавить в индекс все изменения в репозитории
  • Вы работаете в нескольких каталогах и хотите закоммитить все изменения
  • Вы удалили файлы и хотите удалить их из репозитория
  • Вы проводите очистку и хотите закоммитить все незакоммиченные изменения
  • Вы предпочитаете подход “закоммитить все”

Используйте git add ., когда:

  • Вы работаете в определенном каталоге и хотите добавить в индекс изменения только там
  • Вам нужна более точная настройка того, что попадает в коммит
  • Вы еще не готовы коммитить удаления
  • Вы работаете incrementally и хотите закоммитить изменения по частям
  • Вы хотите избежать случайного добавления в индекс непредусмотренных изменений

Альтернативные подходы

Для более точного контроля рассмотрите эти альтернативы:

bash
# Добавить только измененные и новые файлы (не удаления)
git add -u           # Update - добавляет измененные и удаленные файлы, но не новые файлы
git add -A           # Добавить все (измененные, новые, удаленные)
git add .            # Добавить все в текущем каталоге (кроме удаленных)

Распространенные ошибки

Неожиданное поведение с удаленными файлами

Наиболее частая проблема - забывание того, что git add . не добавляет удаления в индекс:

bash
# Это не работает как ожидалось для удаленных файлов
git add .
git commit -m "Очистка"
# Результат: Удаленные файлы остаются в репозитории!

Решение: Используйте git rm для удаленных файлов при использовании git add .:

bash
git rm file2.txt
git add .
git commit -m "Очистка"

Ограничения, связанные с каталогами

Выполнение git add . из неправильного каталога может привести к пропуску важных изменений:

bash
# Из неправильного каталога
cd subdir/
git add .  # Добавляет в индекс изменения только в subdir, пропускает изменения в корневом каталоге

Решение: Либо выполняйте команду из корневого каталога, либо используйте git add --all независимо от текущего местоположения.

Вопросы производительности

Хотя обе команды обычно быстры, git add --all может работать медленнее в больших репозиториях, так как он сканирует все рабочее дерево, в то время как git add . сканирует только текущий каталог.


Заключение

Различие между git add --all и git add . сводится к области действия и обработке удаленных файлов. git add --all добавляет все изменения во всем репозитории, включая удаления, в то время как git add . добавляет изменения только в текущем каталоге и его подкаталогах, исключая удаления. Выбирайте git add --all для полных коммитов и git add . для более целенаправленного добавления изменений в индекс. Понимание этого различия помогает избежать распространенных ошибок в рабочем процессе Git и гарантирует, что ваши коммиты содержат именно то, что вы планировали.


Источники

  1. Официальная документация Git - git-add
  2. Учебник Atlassian по Git - Добавление файлов в индекс
  3. Книга Git Pro - Область индексации
  4. Stack Overflow - Разница между git add -A и git add .
  5. Документация GitHub - Добавление файлов в репозиторий