
Иногда при работе с Git может потребоваться отменить последний коммит. Коммит — это снимок состояния репозитория Git на определённый момент времени. В Git есть переменная HEAD , которая указывает на последний коммит в текущей рабочей ветке. Чтобы отменить коммит, достаточно указать в переменной HEAD предыдущий снимок.
В этом руководстве объясняется, как отменить последний коммит Git.
Не рекомендуется отменять коммит, уже отправленный в общий репозиторий. Если вы хотите только изменить сообщение о коммите, ознакомьтесь с этой статьей .
Архитектура Git Three-Tree
В 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~1git 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
Команда выведет список всех коммитов, включая идентификатор и первую строку сообщения коммита:
32921222 (HEAD -> master) Update changelog 7505724c adding new tests 750862ce new blog post 95a63417 sort configuration file 252032e4 Refactor User class ...
Узнав идентификатор коммита, который вы хотите сбросить, просто передайте этот идентификатор команде git reset :
git reset --hard 95a63417
Заключение
Чтобы отменить последний коммит, используйте команду git reset . Не сбрасывайте отправленные коммиты, так как это может создать массу проблем для ваших коллег.
Если у вас возникла проблема или вы хотите оставить отзыв, оставьте комментарий ниже.
Связанные руководства