Короткий ответ:
git reset 'HEAD@{1}'
Длинный ответ:
Git ведет журнал всех обновлений ссылок (например, извлечение, сброс, фиксация, слияние). Вы можете просмотреть его, набрав:
git reflog
Где-то в этом списке находится коммит, который вы потеряли. Допустим, вы только что набрали git reset HEAD~
и хотите отменить это. Мой рефлог выглядит так:
$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]
Первая строка говорит, что HEAD
0 позиций назад (другими словами, текущая позиция) составляет 3f6db14; он был получен путем сброса на HEAD~
. Во второй строке указано, что HEAD
1 позиция назад (другими словами, состояние до сброса) - d27924e. Он был получен путем проверки конкретного коммита (хотя сейчас это не важно). Итак, чтобы отменить сброс, запустите git reset HEAD@{1}
(или git reset d27924e
).
Если, с другой стороны, с тех пор вы обновили HEAD, вы выполнили какие-то другие команды, то требуемый коммит не будет в верхней части списка, и вам нужно будет выполнить поиск по reflog
.
Последнее замечание: может быть проще взглянуть на reflog
конкретную ветвь, которую вы хотите отменить, скажем master, а не HEAD
:
$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]
Это должно иметь меньше шума, чем в целом HEAD reflog
.