Обзор команд Git для отмены изменений

Отменяем удаление файла 

Предположим, что мы случайно удалили файл, например 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.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи George Pipis: How to Undo Changes in Git

Предыдущая статьяКак загружать файлы и изображения в приложении Django
Следующая статьяЧто нужно знать разработчику ПО