Другое

Git Add -u: Добавить все удалённые файлы за одну команду

Узнайте, как с помощью git add -u можно быстро добавить все удалённые файлы в Git одним вызовом. Идеально для Visual Studio и Windows Explorer.

Как зафиксировать все удалённые файлы в Git одной командой?

Когда я удаляю файлы с диска, они отображаются как удалённые в статусе репозитория Git:

C:\git\bc>git status
# On branch tracking2
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    test.txt
#

Есть ли одна команда, которая подготовит к коммиту все удалённые файлы, которые уже исчезли с диска, аналогично тому, как git add . добавляет новые и изменённые файлы?

Я работаю с Visual Studio и Windows Explorer, чтобы управлять деревом исходного кода, и часто удаляю несколько файлов одновременно. Мне неудобно вручную вызывать git rm для каждого удалённого файла, поскольку файлы уже не существуют в рабочем каталоге, и нет подсказки командной строки, которая помогла бы в наборе команд.

Какой Git‑команда или рабочий процесс позволяет эффективно подготовить к коммиту все удалённые файлы, которые уже удалены с диска?

Самый прямой способ добавить в индекс все удалённые файлы в Git одним командой – это использовать git add -u (или git add --update). Эта команда автоматически добавляет в индекс все изменённые и удалённые файлы в рабочем каталоге, не затрагивая неотслеживаемые файлы. При выполнении git add -u Git обнаружит, что файлы удалены из рабочего каталога, и подготовит эти удаления к следующему коммиту.

Содержание

Понимание системы индексации Git

Прежде чем погрузиться в конкретные команды, полезно понять, как Git обрабатывает удаление файлов в своей системе индексации. Когда вы удаляете файл из рабочего каталога с помощью Windows Explorer или Visual Studio, Git распознаёт это изменение, но не ставит его в индекс автоматически.

Git поддерживает три основные области: рабочий каталог (ваши реальные файлы), индекс (staging area) и репозиторий (коммиты). При удалении файла Git помечает его как «удалённый» в рабочем каталоге, но вам нужно явно указать Git, чтобы он добавил это удаление в индекс.

Именно поэтому в выводе git status вы видите сообщение «deleted:». Файл удалён из рабочего каталога, но Git всё ещё должен знать, что вы хотите включить это удаление в следующий коммит.

Самая лучшая команда: git add -u

Самое эффективное решение для вашего случая – git add -u или его более длинная форма git add --update.

bash
git add -u

Эта команда выполнит:

  • Добавит все изменённые файлы
  • Добавит все удалённые файлы (удалив их из индекса)
  • Игнорирует неотслеживаемые файлы (новые файлы, которые вы ещё не добавили в Git)

Согласно GitHub Git Guides, git add -u «добавляет только изменённые и удалённые файлы, НЕ новые файлы». Это делает её идеальной для вашего рабочего процесса, когда вы удаляете файлы через Windows Explorer или Visual Studio и хотите сразу добавить все эти удаления.

Флаг -u конкретно говорит Git обновить индекс изменениями файлов, которые уже отслеживаются, включая удаления.


Как это работает

При выполнении git add -u Git:

  1. Сравнивает ваш рабочий каталог с индексом
  2. Для любого отслеживаемого файла, который существует в индексе, но отсутствует в рабочем каталоге, ставит удаление в индекс
  3. Для любого отслеживаемого файла, который был изменён, ставит изменения в индекс
  4. Полностью игнорирует неотслеживаемые файлы

Это именно то, что вам нужно, когда вы вручную удалили несколько файлов через файловую систему.

Альтернативные команды и их различия

Хотя git add -u является лучшим решением для вашего конкретного случая, полезно понять другие команды Git для индексации и их различия:

git add -A или git add --all

bash
git add -A

Как объясняется в GitBreeze’s guide, git add -A «найдёт все файлы во всех каталогах вашего проекта и добавит их все». Это включает:

  • Новые (неотслеживаемые) файлы
  • Изменённые файлы
  • Удалённые файлы

Флаг -A является сокращением для --all и добавляет всё. Это может быть более, чем вам нужно, если у вас много новых неотслеживаемых файлов, которые вы не хотите включать в текущий коммит.

git add .

В современных версиях Git (2.x) git add . ведёт себя так же, как git add -A, если выполняется из корня репозитория. Однако, как отмечено в обсуждениях Stack Overflow, существуют важные различия в поведении между версиями Git:

  • Git 1.x: git add . добавляет только файлы в текущем каталоге и его подкаталогах, но не в родительских каталогах
  • Git 2.x: git add . эквивалентен git add -A

git add *

git add * обычно не рекомендуется, потому что:

  • Он добавляет только существующие файлы (не учитывает удалённые файлы)
  • Не обрабатывает файлы с ведущими точками корректно
  • Расширение шаблонов оболочки может быть непредсказуемым

Таблица сравнения

Команда Новые файлы Изменённые файлы Удалённые файлы Примечания
git add -u Лучший вариант для вашего случая
git add -A Добавляет всё
git add . То же, что -A в Git 2.x
git add * Пропускает удалённые файлы

Источник: GeeksforGeeks - Git Command Differences

Рабочий процесс Visual Studio и Windows Explorer

Для вашего конкретного рабочего процесса с Visual Studio и Windows Explorer, вот рекомендуемый процесс:

  1. Удалите файлы с помощью Windows Explorer или Solution Explorer в Visual Studio
  2. Проверьте статус с помощью git status, чтобы увидеть удалённые файлы
  3. Добавьте удаления с помощью git add -u
  4. Сделайте коммит с помощью git commit -m "описание"
bash
# Шаг 1: Файлы удалены через файловую систему
# Шаг 2: Проверяем изменения
git status

# Шаг 3: Добавляем все удаления и изменения
git add -u

# Шаг 4: Коммит
git commit -m "Deleted obsolete files"

Этот рабочий процесс намного эффективнее, чем вручную вводить git rm для каждого удалённого файла, особенно когда вы удалили несколько файлов одновременно.


Создание алиаса для удобства

Если вы часто выполняете эту задачу, вы можете создать алиас оболочки, чтобы сделать это ещё проще. Добавьте это в ваш ~/.bashrc или ~/.bash_profile:

bash
alias gitstageall="git add -u"

Тогда вы можете просто выполнить:

bash
gitstageall
git commit -m "описание"

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

Давайте разберём несколько практических примеров, чтобы увидеть, как работает git add -u в разных сценариях.

Пример 1: Удаление одного файла

bash
# Удаляем файл через Windows Explorer
del test.txt

# Проверяем статус
git status
# Вывод:
# deleted:    test.txt

# Добавляем удаление
git add -u

# Проверяем статус снова
git status
# Вывод:
# Changes to be committed:
#   deleted:    test.txt

# Коммит
git commit -m "Delete test.txt"

Пример 2: Удаление нескольких файлов

bash
# Удаляем несколько файлов
del file1.txt file2.txt file3.txt

# Добавляем все удаления
git add -u

# Коммит
git commit -m "Clean up obsolete files"

Пример 3: Смешанные изменения (удаления и модификации)

bash
# Есть удалённые и изменённые файлы
del oldfile.txt
echo "new content" > existingfile.txt

# Добавляем и удаляем, и изменяем
git add -u

# Коммит
git commit -m "Update files and remove old ones"

Что с неотслеживаемыми файлами?

Если у вас есть новые файлы, которые вы ещё не добавили в Git, git add -u их игнорирует. Это, в действительности, полезно для вашего рабочего процесса, потому что:

  • Вы можете работать над новыми файлами, не ставя их в индекс случайно
  • Вы можете сосредоточиться на коммите только тех изменений, которые хотите (удаления и изменения)
  • Новые файлы остаются неотслеживаемыми до тех пор, пока вы явно не добавите их с помощью git add

Продвинутые техники и алиасы

Для ещё большей эффективности вы можете создать более сложные алиасы или скрипты.

Алиас оболочки

bash
# Добавьте в ~/.bashrc
alias gitcommitall="git add -u && git commit -m"

Использование:

bash
gitcommitall "Clean up project files"

Функция PowerShell (для Windows)

powershell
# Добавьте в ваш профиль PowerShell
function Git-Commit-All($message) {
    git add -u
    git commit -m $message
}

Использование:

powershell
Git-Commit-All "Remove obsolete files"

Git-алиас

Вы также можете создать Git-алиас:

bash
git config --global alias.stageall 'add -u'

Использование:

bash
git stageall
git commit -m "описание"

Источник: Command Line Fu - Git Stage All Deleted Files

Заключение

Чтобы эффективно добавить все удалённые файлы в Git одной командой, используйте git add -u. Эта команда специально предназначена для добавления изменённых и удалённых файлов без влияния на неотслеживаемые файлы, что делает её идеальной для вашего рабочего процесса с Visual Studio и Windows Explorer.

Ключевые выводы:

  • Используйте git add -u, чтобы добавить только удаления и изменения (игнорирует новые файлы)
  • git add -A добавляет всё, включая новые файлы, если это нужно
  • В современных версиях Git (v2.x) git add . эквивалентен git add -A из корня репозитория
  • Создавайте алиасы, чтобы сделать ваш рабочий процесс ещё более эффективным

Этот подход избавляет от необходимости вручную выполнять git rm для каждого удалённого файла, экономя значительное время и усилия при работе с множественными удалениями файлов через файловую систему.

Авторы
Проверено модерацией
Модерация