↓Перейти к содержанию
  1. Git: руководства и команды/

git rm: удаление файлов из Git репозитория

·5 минут·

Удаление файла из Git-репозитория требует специальной команды — git rm. Просто удалить файл через rm или проводник недостаточно: Git продолжит его отслеживать и будет показывать в статусе как «deleted». Команда git rm делает два дела сразу: удаляет файл и регистрирует это удаление в индексе для последующего коммита.

Три способа удалить файл — правильный и неправильные #

Чтобы понять зачем нужна git rm, посмотрим на разницу между подходами:

Неправильно — просто удалить файл:

rm old-file.js
git status
# Changes not staged for commit:
#   deleted:    old-file.js

Файл удалён с диска, но Git всё ещё его отслеживает. Придётся дополнительно делать git add -u или git add old-file.js, чтобы зарегистрировать удаление.

Правильно — использовать git rm:

git rm old-file.js
git status
# Changes to be committed:
#   deleted:    old-file.js

git commit -m "Remove old-file.js"

Один шаг вместо двух: файл удалён с диска и удаление уже в индексе.

Удалить из Git но сохранить локально:

git rm --cached .env
# Файл остаётся на диске, но Git перестанет его отслеживать

Этот вариант разберём подробнее ниже.

Базовый синтаксис #

# Удалить один файл
git rm файл.js

# Удалить несколько файлов
git rm файл1.js файл2.js

# Удалить все файлы с расширением .log
git rm *.log

# Удалить папку со всем содержимым (рекурсивно)
git rm -r old-directory/

После git rm нужно сделать коммит — само удаление ещё не сохранено в истории:

git rm old-file.js
git commit -m "Remove old-file.js: больше не используется"

git rm –cached: убрать из Git, сохранить файл #

Это один из самых полезных вариантов git rm. Флаг --cached удаляет файл из отслеживания Git, но оставляет его на диске.

Классический сценарий: файл с секретами или конфигурацией случайно попал в репозиторий:

# .env с паролями случайно закоммичен
git rm --cached .env

# Добавить в .gitignore чтобы не повторилось
echo ".env" >> .gitignore

# Закоммитить оба изменения
git add .gitignore
git commit -m "Remove .env from tracking, add to .gitignore"

Теперь .env остаётся у тебя локально (со всеми паролями), но в репозитории его нет, и следующие коммиты его игнорируют.

Другой сценарий — удалить из репозитория папку с зависимостями, которая туда случайно попала:

# node_modules случайно закоммичен
git rm -r --cached node_modules/

# Добавить в .gitignore
echo "node_modules/" >> .gitignore

git add .gitignore
git commit -m "Remove node_modules from tracking"

Проверка перед удалением #

Если хочешь сначала посмотреть что будет удалено — используй флаг -n (dry run):

# Посмотреть что удалится без реального удаления
git rm -n *.log
# rm 'debug.log'
# rm 'error.log'
# rm 'access.log'

# Убедившись — удалить реально
git rm *.log

Принудительное удаление #

Если файл изменён, но изменения не закоммичены, git rm откажет:

$ git rm important-file.js
error: the following files have local modifications:
    important-file.js
(use --cached to keep the file, or -f to force removal)

Флаг -f (force) отменяет эту защиту:

# ⚠️ Внимание: незакоммиченные изменения будут потеряны безвозвратно
git rm -f important-file.js

⚠️ Осторожно: принудительное удаление уничтожает незакоммиченные изменения. Убедись, что они тебе действительно не нужны.

Восстановление удалённого файла #

Удаление файла через git rm и коммит — не катастрофа. Файл можно восстановить из истории:

# Посмотреть историю удалённого файла
git log --all -- old-file.js

# Восстановить файл из конкретного коммита
git restore --source=<commit-hash> old-file.js

# Восстановить из коммита до удаления (HEAD~1 = предыдущий коммит)
git restore --source=HEAD~1 old-file.js

# Альтернатива (старый синтаксис до Git 2.23)
git checkout <commit-hash> -- old-file.js

После восстановления файл появится в рабочей директории. Нужно сделать git add и git commit чтобы вернуть его в актуальную ветку.

Удаление файлов, уже удалённых через rm #

Если ты уже удалил файлы обычным rm и хочешь зарегистрировать это в Git:

# Удалили файлы через rm, git status показывает:
# Changes not staged for commit:
#   deleted:    file1.js
#   deleted:    file2.js

# Способ 1: добавить все удаления в индекс
git add -u

# Способ 2: добавить конкретный удалённый файл
git add file1.js

# Способ 3: добавить всё (включая новые файлы)
git add -A

# После этого коммитить
git commit -m "Remove obsolete files"

Правильный рабочий процесс удаления #

# 1. Проверить текущее состояние
git status

# 2. Посмотреть что удалится (dry run)
git rm -n old-code/

# 3. Удалить
git rm -r old-code/

# 4. Проверить что в индексе
git status
# Changes to be committed:
#   deleted:    old-code/helper.js
#   deleted:    old-code/utils.js

# 5. Посмотреть diff
git diff --cached

# 6. Закоммитить с понятным сообщением
git commit -m "Remove old-code/: заменено на src/utils/"

# 7. Убедиться что файлов нет в актуальной версии
git ls-files | grep old-code
# (пустой вывод — файлов нет)

git rm и .gitignore #

Важный нюанс: если файл уже отслеживается Git, добавление его в .gitignore не остановит отслеживание. Сначала нужно удалить его из индекса:

# Неправильный порядок: добавил в .gitignore, но файл всё равно отслеживается
echo "config.local.js" >> .gitignore
git status
# Changes not staged for commit:
#   modified:    config.local.js   ← всё ещё отслеживается!

# Правильный порядок:
git rm --cached config.local.js   # удалить из отслеживания
echo "config.local.js" >> .gitignore  # добавить в игнор
git add .gitignore
git commit -m "Stop tracking config.local.js"
# Теперь изменения в config.local.js игнорируются

git mv — связанная команда #

Переименование файлов в Git похоже на удаление старого и добавление нового. Для этого есть специальная команда git mv:

# Переименовать файл
git mv old-name.js new-name.js

# Это эквивалентно:
mv old-name.js new-name.js
git rm old-name.js
git add new-name.js

# После git mv файл готов к коммиту
git commit -m "Rename old-name.js to new-name.js"

Часто задаваемые вопросы #

В чём разница между rm и git rm? #

rm удаляет файл только с диска. Git продолжает его отслеживать и покажет в статусе как «deleted». git rm удаляет файл с диска и одновременно регистрирует удаление в индексе — готово к коммиту.

Как удалить файл из Git, не удаляя с диска? #

Используй git rm --cached имя-файла. Файл останется локально, но Git перестанет его отслеживать. Обычно после этого нужно добавить файл в .gitignore.

Что если я случайно сделал git rm? #

До коммита можно восстановить: git restore имя-файла или git checkout -- имя-файла. После коммита — через git restore --source=HEAD~1 имя-файла.

Нужно ли коммитить после git rm? #

Да. git rm только регистрирует удаление в индексе. Чтобы изменение попало в историю репозитория, нужен коммит.

Как удалить файл только из удалённого репозитория, не трогая локальный? #

Сначала удали из локального репозитория (git rm --cached), закоммить, потом запуши. Файл пропадёт из удалённого репозитория при следующем git push.


Читай также #