В большинстве случаев да.
В зависимости от состояния, в котором находился ваш репозиторий при запуске команды, эффекты git reset --hard
могут варьироваться от тривиального до отменного, в принципе невозможного.
Ниже я перечислил ряд возможных сценариев и способы их восстановления.
Все мои изменения были зафиксированы, но теперь их нет!
Эта ситуация обычно возникает, когда вы запускаете git reset
с аргументом, как в git reset --hard HEAD~
. Не волнуйтесь, это легко восстановить!
Если вы только что запустили git reset
и с тех пор больше ничего не делали, вы можете вернуться туда, где находились, с помощью одной строки:
git reset --hard @{1}
Это сбрасывает вашу текущую ветку в любое состояние, в котором она находилась до того, как в последний раз она была изменена (в вашем случае самой последней модификацией ветки будет полный сброс, который вы пытаетесь отменить).
Если, однако, вы внесли другие изменения в вашу ветку после сброса, приведенная выше строка не будет работать. Вместо этого вы должны запустить git reflog
<branchname>
, чтобы увидеть список всех последних изменений, внесенных в вашу ветку (включая перезагрузки). Этот список будет выглядеть примерно так:
7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit
Найдите в этом списке операцию, которую вы хотите отменить. В приведенном выше примере это будет первая строка с надписью «сброс: переход к HEAD ~». Затем скопируйте представление коммита перед (ниже) этой операции. В нашем случае это будет master@{1}
(или 3ae5027
, они оба представляют один и тот же коммит) и запустите git reset --hard <commit>
, чтобы вернуть текущую ветвь обратно к этому коммиту.
Я поставил свои изменения с git add
, но никогда не фиксировал. Теперь мои изменения исчезли!
Немного сложнее оправиться. В git есть копии файлов, которые вы добавили, но, поскольку эти копии никогда не были привязаны к какому-либо конкретному коммиту, вы не можете восстановить изменения сразу. Вместо этого вам нужно найти отдельные файлы в базе данных git и восстановить их вручную. Вы можете сделать это, используя git fsck
.
Подробнее об этом см. Отменить git reset --hard с незафиксированными файлами в области подготовки .
У меня были изменения в файлах в моем рабочем каталоге, которые я никогда не ставил с git add
и никогда не фиксировал. Теперь мои изменения исчезли!
Э-э-э Ненавижу тебе это говорить, но тебе, вероятно, не повезло. git не хранит изменения, которые вы не добавляете или не фиксируете, и в соответствии с документацией для git reset
:
- жесткий
Сбрасывает индекс и рабочее дерево. Любые изменения отслеживаемых файлов в рабочем дереве, начиная с <commit>
, отбрасываются.
Возможно, что может быть в состоянии восстановить ваши изменения с помощью какой-либо утилиты восстановления диска или профессиональной службы восстановления данных, но на данный момент это, вероятно, больше проблем, чем стоит.