Такая ситуация, что вместо merge сделал rebase. Получается изменения коряво слились, как можно откатиться к моему локальному коммиту, до того как был сделан rebase и коммит ?
-
@PavelMayorov эх, а я не заметил, что уже был такой вопрос. – Nick Volynkin Nov 14 '16 at 12:38
-
1@NickVolynkin раз уж вы написали ответ - лучше тот вопрос закрыть как дубликат этого. Потому что у того вопроса низкое качество (две проблемы в одном вопросе, решена только вторая), автор убежал... – Pavel Mayorov Nov 14 '16 at 12:41
-
@PavelMayorov ок, разумное предложение, перезакрыл в обратную сторону. :) – Nick Volynkin Nov 14 '16 at 12:43
2 Answers
Ищите в рефлоге прошлый HEAD-коммит ветки, которую нужно восстановить к прошлому состоянию:
$ git reflog
# это просто пример, у вас будут другие id и строки
91e9b6e HEAD@{0}: rebase finished: returning to refs/heads/master
91e9b6e HEAD@{1}: rebase: checkout @{-1}
a26257f HEAD@{2}: checkout: ...
91e9b6e HEAD@{3}: commit: ...
...
Просто ищите коммит с тем сообщением, которое вам нужно. Он будет третьим в списке, если вы больше ничего не делали после ребейза.
На всякий случай сделаем бэкап
git branch backup
Потом восстановим текущую ветку к найденному коммиту. Можно использовать как id, так и указатель HEAD@{номер}
git reset --hard HEAD@{2}
Если всё прошло удачно, можно удалять бэкап
git branch -D backup
Подробнее о git reset --hard: Как вернуться (откатиться) к более раннему коммиту?
- 34,094
В дополнение к ответу выше. Чтобы не использовать git-reflog и не копировать хэши, поможет команда с откатом по времени, например:
git reset --hard master@{"10 minutes ago"}
или
git reset --hard master@{12:30}
также должны поддерживаться такие варианты:
{yesterday}, {1 month 2 weeks 3 days 1 hour 1 second ago}, {1979-02-26 18:30:00}
Если Вы примерно знаете, когда совершили лишнее действие, то можете откатиться с помощью данной команды.
- 1,369