Введение
При работе с Git вы можете захотеть отменить последнюю фиксацию. Коммит — это моментальный снимок репозитория Git в данный момент времени. В Git есть ссылочная переменная HEAD
, которая указывает на последнюю фиксацию в текущей рабочей ветке. Чтобы отменить фиксацию, все, что вам нужно сделать, это указать переменную HEAD
на предыдущий снимок.
В этом руководстве объясняется, как отменить последнюю фиксацию Git в Linux.
Не рекомендуется отменять коммит, который уже был отправлен в общий репозиторий. Если вы хотите изменить только сообщение фиксации, см. эту статью.
Архитектура Git с тремя деревьями
В Git вы можете отменить изменения, используя команду git reset
, за которой следует идентификатор коммита.
git reset
принимает дополнительные аргументы, позволяющие управлять поведением команды. Чтобы лучше понять, как работает reset
, давайте поговорим о трех разных деревьях Git. Архитектура с тремя деревьями — ключевая концепция системы управления Git. Их называют деревьями, потому что они представляют наборы файлов.
Git управляет и манипулирует следующими тремя деревьями:
- Рабочий каталог: каталог, включающий все подкаталоги и файлы в локальной файловой системе, связанные с репозиторием. Его часто называют «рабочим деревом». Рабочий каталог — это что-то вроде песочницы, где вы можете протестировать изменения, прежде чем зафиксировать их в промежуточном индексе.
- Индекс: это дерево отслеживает новые или измененные файлы, которые были добавлены в индекс с помощью
git add
для включения в следующую фиксацию. Его часто называют «промежуточной областью» или «промежуточным индексом». HEAD
— указатель на ваш последний коммит в текущей ветке.
Команда git reset
имеет три аргумента, которые соответствуют трем деревьям:
--soft
— Обновляет указательHEAD
на указанный коммит. Рабочий каталог и индекс не изменяются.--mixed
— обновляет указательHEAD
и сбрасывает индекс до указанной фиксации. Рабочий каталог не трогаем. Это рабочий режим командыreset
по умолчанию.--hard
— обновляет указательHEAD
и сбрасывает индекс и рабочий каталог до указанной фиксации. Будьте очень осторожны при использовании этой опции, так как любые локальные изменения, которые вы не сделали, будут перезаписаны и потеряны.
Отменить последний коммит
Чтобы отменить последнюю фиксацию без потери изменений, внесенных в локальные файлы и индекс, вызовите git reset
с параметром --soft
, за которым следует HEAD~1
:
git reset --soft HEAD~1
HEAD~1
— это переменная, указывающая на предыдущий коммит. Приведенная выше команда перемещает текущую ветку назад на одну фиксацию, эффективно отменяя последнюю фиксацию. Если вы запустите команду git status
, вы увидите, что измененные файлы перечислены как несохраненные изменения.
Чтобы обновить указатель HEAD
для сброса индекса, запустите git reset
с --mixed
или без параметра:
git reset --mixed HEAD~1
git reset HEAD~1
Измененные файлы сохраняются, но, в отличие от предыдущего примера, изменения теперь не готовятся к фиксации.
Если вы не хотите сохранять изменения, внесенные в файлы, вызовите команду git reset
с параметром --hard
:
git reset --hard HEAD~1
Перед выполнением жесткого сброса убедитесь, что вам больше не нужны изменения.
Отменить несколько коммитов
С помощью git reset
вы можете вернуться к любому предыдущему коммиту.
Например, чтобы переместить текущую ветку назад на три коммита, вы должны использовать:
git reset --hard HEAD~3
Поскольку мы используем --hard
, приведенная выше команда удалит последние три снимка из истории коммитов.
Другой способ вернуться к определенному коммиту — передать идентификатор коммита команде git reset
.
Используйте git log --oneline
, чтобы найти идентификаторы коммитов:
git log --oneline
Команда покажет список всех коммитов, включая идентификатор и первую строку сообщения коммита:
42912333 (HEAD -> master) Update changelog
6505778c adding new tests
650862ab new blog post
85a63416 sort configuration file
152032c4 Refactor User class...
Как только вы узнаете идентификатор коммита, к которому хотите выполнить сброс, передайте его команде git reset
:
git reset --hard 85a63416
Вывод
Чтобы отменить последнюю фиксацию, используйте команду git reset
. Не сбрасывайте переданные коммиты, так как это потенциально может вызвать много проблем для вашей команды.