Найти тему
Nuances of programming

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

Оглавление

Источник: Nuances of Programming

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

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

git rm myfile.txt
git status

-2

Для его восстановления выполняем команду:

git restore myfile.txt

-3

Отменяем индексирование файла

Допустим, мы по ошибке проиндексировали файл, выполнив команду 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 и локально его клонируем:

-4

$ git clone https://github.com/pipinho13/delete_example.git

Меняем рабочий каталог на клонированный репозиторий. Как видно, здесь есть файлы README.md и .git.

-5

Далее создаем файл 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

-6

Файл wrong.txt добавлен в удаленный репозиторий.

Удаляем файл

При необходимости удалить файл как из удаленного каталога, так и локальной файловой системы выполняем команды:

git rm wrong.txt
git commit -m "remove the wrong.txt file"
git push origin main

Как видим, цель достигнута:

-7

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

-8

Удаляем 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/

Проверяем удаленный каталог:

-9

wrong.txt успешно удален из удаленного репозитория!

Со списком наиболее распространенных команд Git и GitHub вы можете ознакомиться по ссылке Git and GitHub Cheatsheet.

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

Читайте нас в Telegram, VK

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