Иногда при работе с 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~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. Не сбрасывайте отправленные коммиты, так как это может вызвать множество проблем для ваших коллег.
Если вы столкнулись с проблемой или хотите оставить отзыв, оставьте комментарий ниже.