Отменяем удаление файла
Предположим, что мы случайно удалили файл, например myfile.txt
:
git rm myfile.txt
git status

Для его восстановления выполняем команду:
git restore myfile.txt

Отменяем индексирование файла
Допустим, мы по ошибке проиндексировали файл, выполнив команду git add myfilename
. Для отмены этого действия воспользуемся командой:
git reset HEAD myfilename
Восстанавливаем предыдущие версии
Посмотрим, как восстановить более ранние версии в случае необходимости. С помощью команды git log
переходим в историю коммитов, выбираем код SHA ранней версии (достаточно первых символов) и выполняем команду git checkout <SHA>
:
git checkout 0dd6680
Получаем следующее сообщение:
Внимание: переключение на '0dd6680'.
Вы находитесь в состоянии 'detached HEAD'("отсоединенный указатель HEAD"). Осмотритесь, внесите пробные изменения и зафиксируйте их. Вы можете отменить любые коммиты, выполненные в этом состоянии, ни на что не влияя при переключении обратно на ветку.
При желании можете создать новую ветку и сохранить свежие коммиты. Для этого понадобится команда switch и -c:
Пример:
git switch -c <new-branch-name>
Для отмены этой операции существует команда:
git switch -
Для отключения данного сообщения установите переменную конфигурации advice.detachedHead в значение false.
На данный момент HEAD указывает на коммит 0dd6680.
Выполняем команду:
cat myfile.txt
Вы увидите, что находитесь в более ранней версии. Вышеприведенная команда вывода checkout
объясняет ситуацию. Эти изменения можно сохранить, если создать новую ветку.
Оказавшись в состоянии “detached HEAD” вполне можно запаниковать, не зная, как вернуться к последней версии в главной ветке master
. Посмотрим, как это сделать:
git checkout main
Получаем сообщение:
Предыдущее положение HEAD указывало на коммит 0dd6680.
Переключение на ветку 'main'.
Состояние вашей ветки обновлено на 'origin/main'.
Откатываем изменения на один коммит
Для отмены предыдущего коммита выполняем команду:
git revert <SHA>
Удаляем неотслеживаемый файл
Допустим, вы добавили файлы, которые еще не подготовлены к коммиту. Чтобы от них избавиться, выполняем команду:
git clean -n
Это пробный запуск, который отображает файлы, подлежащие удалению. Подтверждаем выполнение этой операции командой:
git clean -f
Отменяем git init
Работая с Git, вы инициализируете проект с помощью git init
. Для отмены данной операции просто удаляем файл .git
из каталога.
rm -rf .git
Дополнительные команды: удаляем файл из удаленного репозитория
При работе с Git и GitHub/GitLab можно случайно отправить файл в удаленный репозиторий. В таком случае возникает необходимость его удалить. Рассмотрим ситуацию на примерах. Создаем удаленный репозиторий GitHub и локально его клонируем:

$ git clone https://github.com/pipinho13/delete_example.git
Меняем рабочий каталог на клонированный репозиторий. Как видно, здесь есть файлы README.md
и .git
.

Далее создаем файл wrong.txt
, который мы отправим в удаленный репозиторий:
ls -ltra
Получаем:
total 6
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 .git/
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:12 ./
-rw-r--r-- 1 gpipis 1049089 21 Jan 13 19:12 wrong.txt
Отправляем wrong.txt
:
git add wrong.txt
git commit -m "pushing the wrong.txt file"
git push origin main

Файл wrong.txt
добавлен в удаленный репозиторий.
Удаляем файл
При необходимости удалить файл как из удаленного каталога, так и локальной файловой системы выполняем команды:
git rm wrong.txt
git commit -m "remove the wrong.txt file"
git push origin main
Как видим, цель достигнута:

ls -ltratotal 5
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:23 ./
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:24 .git/
Удаляем файл из удаленного репозитория Git, но сохраняем его локально
Повторяем последовательность действий по созданию файла wrong.txt
, который на этот раз мы удалим только из удаленного репозитория:
ls -ltratotal 6
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:24 .git/
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:33 ./
-rw-r--r-- 1 gpipis 1049089 13 Jan 13 19:33 wrong.txt
Отправляем файл wrong.txt
:
git add wrong.txt
git commit -m "pushing the wrong.txt file again"
git push origin main

Удаляем wrong.txt
только из удаленного репозитория. Для этого используем тег cached
.
git rm --cached wrong.txt
git commit -m "remove the wrong.txt file only from remote repo"
git push origin main
Проверяем локальный репозиторий:
$ ls -ltratotal 6
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:33 ./
-rw-r--r-- 1 gpipis 1049089 13 Jan 13 19:33 wrong.txt
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:38 .git/
Проверяем удаленный каталог:

wrong.txt
успешно удален из удаленного репозитория!
Со списком наиболее распространенных команд Git и GitHub вы можете ознакомиться по ссылке Git and GitHub Cheatsheet.
Читайте также:
- Полезные команды Git
- 3 верных способа оптимизировать ревью на GitHub
- Как настроить отдельные SSH-ключи для нескольких учётных записей GitLab
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи George Pipis: How to Undo Changes in Git