git rm
Узнайте, что делает команда git rm, как её отменить и чем она отличается от shell-команды rm.
Команда git rm удаляет один или несколько файлов из Git-репозитория. На этой странице объясняется, что делает git rm, какие параметры она принимает, чем отличается от shell-команды rm, как отменить удаление и приведены практические примеры.
Что делает git rm
git rm удаляет отслеживаемые файлы — те, о которых Git уже знает. По умолчанию она удаляет файл как из рабочего каталога (файлы на диске), так и из индекса (снимок, который Git запишет в следующий коммит), а затем индексирует это удаление, чтобы оно попало в следующий коммит.
Несколько важных моментов:
git rmработает только с отслеживаемыми файлами. Она завершается ошибкойfatal: pathspec '...' did not match any files, если попытаться удалить неотслеживаемый файл — Git не следил за ним, поэтому записывать нечего.- Она может удалить файл только из индекса (с флагом
--cached), но не может удалить файл только из рабочего каталога — для этого используется обычное удаление средствами shellrm. - Она не удаляет ветки, теги или коммиты. Работа ведётся только с файлами.
- Удаление не становится постоянным до коммита. До этого момента его легко отменить (см. Отмена git rm).

Типичный рабочий процесс выглядит так:
git rm notes.txt # deletes notes.txt and stages the deletion
git commit -m "Remove notes.txt"Параметры команды git rm
| Параметр | Что делает |
|---|---|
<file>… | Путь (или пути) к удаляемым файлам. Принимает глобы, например *.txt. |
-f, --force | Отключает проверку безопасности, которая сравнивает файл в HEAD с индексом и рабочим каталогом. Нужен, если файл содержит незафиксированные изменения. |
-n, --dry-run | Запускает команду без фактического удаления. Выводит только список файлов, которые были бы удалены. |
-r | Рекурсивное удаление. Необходимо для удаления каталога вместе со всем его содержимым. |
-- | Отделяет параметры от имён файлов. Используйте, когда имя файла можно спутать с параметром (например, файл буквально названный -f). |
--cached | Удаляет файл только из индекса. Копия в рабочем каталоге остаётся нетронутой. |
--ignore-unmatch | Завершается с кодом 0, даже если ни один файл не совпал. Полезно в скриптах, где отсутствие пути не должно быть ошибкой. |
-q, --quiet | Подавляет вывод, который git rm обычно печатает для каждого файла. |
Отмена git rm
git rm обновляет индекс и рабочий каталог, но изменение не становится постоянным до коммита. До этого момента файл можно восстановить обычными командами Git. Нужная команда зависит от того, насколько далеко вы хотите откатиться.
До коммита удаления
Чтобы отменить индексирование удаления, но оставить файл удалённым на диске, сбросьте запись в индексе обратно к HEAD:
git reset HEAD <file>Чтобы полностью вернуть файл — как в индексе, так и в рабочем каталоге — используйте современную команду git restore:
git restore --staged --worktree <file>Более старые варианты — git reset HEAD <file> с последующим git checkout -- <file> — по-прежнему работают, но git restore является рекомендованным способом в актуальных версиях Git.
После коммита удаления
Если вы уже создали коммит, фиксирующий удаление, файл существует только в истории. Найдите безопасную точку с помощью git reflog и восстановите файл из коммита, где он ещё существовал:
git restore --source=HEAD~1 <file>Git rm и rm
Shell-команда rm и git rm обе удаляют файлы с диска, но Git обрабатывает их по-разному.
Когда вы запускаете обычный shell rm для отслеживаемого файла, Git-репозиторий замечает, что файл исчез, и отображает удаление как неиндексированное изменение. Вам всё равно нужно запустить git add (или git add -u), чтобы записать его в индекс перед коммитом.
git rm выполняет оба шага сразу: удаляет файл и индексирует удаление, так что оно готово к следующему коммиту немедленно.
# Shell rm — deletion is unstaged, needs git add afterwards
rm notes.txt
git add notes.txt
# git rm — deletion is staged in one step
git rm notes.txtУдаление файлов только из индекса
Распространённый случай — оставить файл на диске, но прекратить его отслеживание в Git. Например, конфигурационный файл или артефакт сборки, который был случайно зафиксирован и теперь должен быть игнорирован. Используйте --cached:
git rm --cached secrets.envФайл остаётся в вашем рабочем каталоге; удаляется только его отслеживаемая копия. После этого добавьте путь в .gitignore, чтобы он не был добавлен снова.
Примеры
Удаление всех файлов .txt в папке (шаблон подстановки):
git rm folder/\*.txtОбратный слеш перед * не позволяет shell раскрыть глоб, поэтому Git сам раскрывает его для отслеживаемых файлов в folder/. Это также охватывает пути в подкаталогах, а не только прямых потомков.
Принудительное удаление файлов с незафиксированными изменениями:
git rm -f git-*.shБез -f команда git rm откажется удалять файл, содержимое которого в рабочем каталоге или индексе отличается от HEAD, чтобы защитить вас от потери работы. Флаг force отключает эту проверку.
Предварительный просмотр удаления без фактического удаления:
git rm -r --dry-run logs/Это выводит список файлов, которые были бы удалены в logs/, позволяя убедиться в их составе перед реальным запуском команды.
Удаление файлов, уже удалённых через shell rm
Если вы удалили несколько отслеживаемых файлов с помощью shell rm и хотите записать все эти удаления в следующий коммит, проиндексируйте каждое удаление сразу:
git add -u
git commit -m "Remove obsolete files"git add -u индексирует обновления уже отслеживаемых файлов, включая удаления. В качестве альтернативы можно составить список удалённых путей и передать их в git rm --cached:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached--diff-filter=D выбирает только удалённые пути, а пара -z / -0 использует NUL-разделители, чтобы безопасно обрабатывать имена файлов с пробелами.