Иногда при работе с Git вам может потребоваться отменить последнюю фиксацию. Коммит — это моментальный снимок репозитория Git в определенный момент времени. В Git есть ссылочная переменная HEAD
которая указывает на последнюю фиксацию в текущей рабочей ветке. Чтобы отменить фиксацию, все, что вам нужно сделать, это указать переменной HEAD
на предыдущий снимок.
В этом руководстве объясняется, как отменить последнюю фиксацию Git.
Не рекомендуется отменять фиксацию, уже помещенную в общий репозиторий. Если вы хотите изменить только сообщение о фиксации, ознакомьтесь с этой статьей .
Содержание
Архитектура 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
Команда отобразит список всех коммитов, включая идентификатор и первую строку сообщения о фиксации:
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
. Не сбрасывайте отправленные коммиты, так как это может вызвать множество проблем для ваших коллег.
Если вы столкнулись с проблемой или хотите оставить отзыв, оставьте комментарий ниже.