Как отменить git reset hard

Аватар пользователя Ivan Mamtsev
Ivan Mamtsev
01 августа 2022

Прежде всего надо понять что такое гит и что делает git reset --hard. Гит это набор ссылок, где каждая хранит изменения файлов. Команда git reset перемещает указатель на выбранную ссылку, а флаг --hard еще и обновляет все файлы в соотвествии с ссылкой. Отсюда решение на первый взгляд парадоксальное -- чтобы отменить git reset --hard нужно сделать git reset --hard на отмененную ссылку.

echo 'foobaz' > 1.txt
git add .
git commit -m 'add 1.txt'
# [main (root-commit) dd64acb] add 1.txt
#  1 file changed, 1 insertion(+)
#  create mode 100644 1.txt
echo 'hellowordl' > 2.txt
git add .
git commit -m 'add 2.txt'
# [main c626c6c] add 2.txt
#  1 file changed, 1 insertion(+)
#  create mode 100644 2.txt
git log
# c626c6c (HEAD -> main) add 2.txt
# dd64acb add 1.txt
git reset --hard HEAD^1
# HEAD is now at dd64acb add 1.txt
cat 2.txt
# cat: 2.txt: No such file or directory
# команда git reflog позволяет посмотреть всю историю коммитов и найти хеш нужного нам коммита
git reflog
# dd64acb HEAD@{1}: reset: moving to HEAD^1
# c626c6c (HEAD -> main) HEAD@{2}: commit: add 2.txt
# dd64acb HEAD@{3}: commit (initial): add 1.txt
git reset --hard c626c6c
# HEAD is now at c626c6c add 2.txt
cat 2.txt 
# hellowordl
2 0
Аватар пользователя Maksim Litvinov
Maksim Litvinov
24 июня 2024

Отменить git reset --hard напрямую невозможно, потому что это команда переписывает историю коммитов. Однако, если вы хотите восстановить состояние репозитория до команды reset, вы можете использовать reflog для нахождения идентификатора коммита, который был активен до reset. Вот как это можно сделать:

Введите git reflog и найдите нужный коммит. Это будет выглядеть примерно так:

1a410ef HEAD@{1}: commit: some commit message

Восстановите состояние репозитория до этого коммита, используя его идентификатор (в данном случае 1a410ef):

git reset --hard 1a410ef

Это вернёт ваш репозиторий к состоянию до нежелательного reset. Помните, что все изменения, сделанные после этого коммита, будут потеряны.

1 0

Есть что добавить? Зарегистрируйтесь

или войдите в аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Курсы по программированию в Хекслете

Программирование

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

Тест-драйв

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки

Бесплатные курсы

Бесплатные курсы по тестированию, дата-аналитике, верстке, программированию на Python, Java, PHP и JavaScript.