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

Как удалить файл из репозитория GitHub: два способа

·7 минут·

Удалить файл из GitHub можно прямо через браузер или через Git команды локально. Важно понимать: файл исчезнет из текущей версии репозитория, но останется в истории коммитов. Это нормально — если только не случайно добавили файл с паролями.

Способ 1: удаление через веб-интерфейс GitHub #

Подходит для быстрых правок без клонирования репозитория:

1. Открыть GitHub → перейти в репозиторий

2. Найти и открыть файл

3. Нажать иконку с тремя точками (...) или иконку мусорной корзины
   в правом верхнем углу при просмотре файла

4. Нажать "Delete file"

5. Заполнить поле Commit message
   Например: "Remove outdated configuration file"

6. Выбрать ветку (обычно main)

7. Нажать "Commit changes"

Файл удалён — новый коммит с удалением появится в истории.

Способ 2: удаление через команду git rm #

# Перейти в репозиторий
cd my-project

# Проверить статус
git status

# Удалить файл (из рабочей директории и из индекса)
git rm path/to/file.txt

# Удалить папку рекурсивно
git rm -r path/to/directory/

# Создать коммит
git commit -m "Remove outdated configuration file"

# Отправить на GitHub
git push origin main

Разница между git rm и просто удалением файла #

# Обычное удаление (файл удалён из диска, но Git ещё отслеживает):
rm filename.txt

# Нужно явно указать Git об удалении:
git add filename.txt  # или git add -u

# git rm делает обе операции за раз:
git rm filename.txt  # удаляет файл И регистрирует удаление в индексе

Рекомендуется использовать git rm — меньше шагов и нет риска забыть добавить удаление в индекс.

Удалить файл из индекса, но оставить на диске #

Если нужно убрать файл из репозитория, но сохранить локально (например, добавить в .gitignore):

# Убрать из Git контроля, сохранить файл
git rm --cached secrets.env

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

# Закоммитить
git add .gitignore
git commit -m "Remove secrets.env from tracking"
git push origin main

Удалить несколько файлов #

# Удалить по маске
git rm *.log

# Удалить несколько конкретных файлов
git rm file1.txt file2.txt file3.txt

# Сухой прогон (посмотреть что будет удалено)
git rm --dry-run *.tmp

Отмена удаления #

Если ещё не закоммитили:

# Восстановить файл из последнего коммита
git restore path/to/file.txt
# или
git checkout -- path/to/file.txt

Если уже создали коммит с удалением (но ещё не push):

# Отменить последний коммит (сохранив изменения)
git reset --soft HEAD~1
# Восстановить файл
git restore path/to/file.txt

Если уже запушили на GitHub:

# Создать revert-коммит
git revert HEAD
git push origin main

Удаление файла из всей истории репозитория #

Если случайно добавили файл с паролями или секретами и его нужно удалить из всей истории:

# Используется инструмент BFG Repo-Cleaner
# Скачать: https://rtyley.github.io/bfg-repo-cleaner/

# Удалить файл из всей истории
bfg --delete-files secrets.env

# Или удалить файлы по шаблону
bfg --delete-files '*.env'

# После BFG обязателен force push
git push --force origin main

Альтернатива — git filter-repo (более современный инструмент).

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

Остаётся ли файл в истории репозитория после удаления? Да. Удаление через git rm создаёт новый коммит, который убирает файл из текущей версии. Файл остаётся доступным в старых коммитах через git show <hash>:path/to/file. Чтобы удалить из всей истории — используйте BFG или git filter-repo.

Как удалить файл из истории (из всех коммитов)? Через BFG Repo-Cleaner или git filter-repo. Это сложная операция с перезаписью истории — требует force push и синхронизации всей команды.

Можно ли отменить удаление файла? Да, пока не запушили: git restore path/to/file. После push: git revert HEAD создаст коммит, восстанавливающий файл.

Чем отличается git rm от просто удаления файла? git rm удаляет файл и сразу регистрирует это удаление в индексе. Обычное удаление (rm) убирает файл с диска, но Git об этом не знает — нужно дополнительно сделать git add -u.

Как удалить файл только из индекса, но сохранить его локально? git rm --cached filename убирает файл из Git контроля, но оставляет его на диске. Полезно чтобы добавить файл в .gitignore.

Удаление с помощью git filter-repo (удаление из истории) #

git filter-repo — современная альтернатива BFG для удаления файлов из всей истории репозитория. Особенно полезна при случайном коммите конфиденциальных данных:

# Установить git filter-repo (требует Python)
pip install --user git-filter-repo
# или на macOS:
brew install git-filter-repo

# Удалить файл из всей истории
git filter-repo --invert-paths --path secrets.env

# Удалить папку из истории
git filter-repo --invert-paths --path config/private/

# Удалить файлы по паттерну
git filter-repo --invert-paths --path-regex '.*\.env$'

# После filter-repo требуется force push
git push origin --force --all
git push origin --force --tags

Использование git filter-repo безопаснее чем git filter-branch (старый способ). Но помните: это переписывает историю. Все разработчики должны переклонировать репозиторий.

Стратегия с .gitignore после случайного добавления #

Если файл уже в истории, но вы хотите, чтобы он больше не был отслеживаем:

# 1. Добавить файл в .gitignore
echo "config/secrets.json" >> .gitignore

# 2. Убрать из отслеживания (но сохранить локально)
git rm --cached config/secrets.json

# 3. Создать коммит
git add .gitignore
git commit -m "Stop tracking secrets.json, add to gitignore"

# 4. Отправить
git push origin main

Теперь файл будет игнорироваться в будущих коммитах, но останется в истории (в старых коммитах). Если это критично — используйте git filter-repo.

Разница между удалением из working tree и staging #

Важно понимать три состояния файла:

# 1. Файл в working tree (диск)
# 2. Файл в staging area (индекс)
# 3. Файл в последнем коммите

# Обычное удаление файла с диска
rm file.txt
git status
# Changes not staged for commit: deleted file.txt

# Нужно зафиксировать удаление
git add file.txt
git commit -m "Remove file"

# git rm делает оба шага сразу
git rm file.txt
git commit -m "Remove file"

# Удалить только из staging, сохранить на диск
git rm --cached file.txt

Восстановление файла по хешу коммита #

Если удалили файл, но потом вспомнили что это была важная информация:

# Найти коммит в котором был файл
git log -- path/to/file.txt
# Нужен последний коммит перед удалением

# Восстановить из конкретного коммита
git show a1b2c3d:path/to/file.txt > path/to/file.txt

# Или создать новый коммит восстановления
git checkout a1b2c3d -- path/to/file.txt
git commit -m "Restore file from a1b2c3d"

Удаление файла из конкретного коммита (git rebase) #

Если нужно убрать файл из старого коммита (но не из всей истории):

# Интерактивный rebase на 5 коммитов назад
git rebase -i HEAD~5

# Выбрать коммит с файлом — изменить 'pick' на 'edit'
# Сохранить и выйти из редактора

# Git остановится на этом коммите
git rm path/to/file.txt
git add path/to/file.txt

# Продолжить rebase
git rebase --continue

Это опасная операция — переписывает историю для всех участников команды.

Практические сценарии и best practices #

Случайно добавили пароль:

# Срочно — лучше сразу удалить из истории
git filter-repo --invert-paths --path secrets.env
git push --force origin main
# Потом: смените пароль! Удаление не помогает если пароль уже скомпрометирован

Добавили файл по ошибке, ещё не push:

# Просто удалить и перекоммитить
git rm filename.txt
git commit --amend --no-edit
git push origin main

Удаляете большой бинарный файл:

# Проверить размер файла в истории
git rev-list --all --objects | grep filename

# После удаления очистить garbage collection
git gc --aggressive

# Объем локального репозитория уменьшится
du -sh .git

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

Остаётся ли файл в истории репозитория после удаления? Да. Удаление через git rm создаёт новый коммит, который убирает файл из текущей версии. Файл остаётся доступным в старых коммитах через git show <hash>:path/to/file. Чтобы удалить из всей истории — используйте git filter-repo или BFG.

Как удалить файл из истории (из всех коммитов)? Через git filter-repo --invert-paths --path filename или BFG. Это сложная операция с перезаписью истории — требует force push и синхронизации всей команды.

Можно ли отменить удаление файла? Да, пока не запушили: git restore path/to/file. После push: git revert HEAD создаст коммит, восстанавливающий файл.

Чем отличается git rm от просто удаления файла? git rm удаляет файл и сразу регистрирует это удаление в индексе. Обычное удаление (rm) убирает файл с диска, но Git об этом не знает — нужно дополнительно сделать git add -u.

Как удалить файл только из индекса, но сохранить его локально? git rm --cached filename убирает файл из Git контроля, но оставляет его на диске. Полезно чтобы добавить файл в .gitignore.

Что если кто-то скачал репозиторий с удалённым файлом? Им нужно обновить свои локальные версии. После вашего push файл будет удалён автоматически при git pull. Но в их истории файл останется в старых коммитах — это нормально.

Как найти все коммиты где был удалён файл? git log --diff-filter=D -- path/to/file показывает все коммиты где этот файл был удалён.

Заключение #

Удалить файл из репозитория GitHub можно через веб-интерфейс (кнопка Delete file) или локально через git rm. Файл исчезнет из актуальной версии, но останется в истории — это нормальное поведение Git. Для удаления из всей истории (секреты, пароли) потребуются специальные инструменты вроде git filter-repo. Для понимания состояния файлов используйте git status.