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

Какой самый простой способ отменить

git reset HEAD~

команда? В настоящее время единственный способ, которым я могу думать, - сделать "git clone http://..." из удаленного репо.

Ответ 1

Краткий ответ:

git reset '[email protected]{1}'

Длинный ответ:

Git хранит журнал всех обновлений ref (например, checkout, reset, commit, merge). Вы можете просмотреть его, набрав:

git reflog

Где-то в этом списке происходит фиксация, которую вы потеряли. Скажем, вы только что набрали git reset HEAD~ и хотите его отменить. Мой рефлог выглядит так:

$ git reflog
3f6db14 [email protected]{0}: HEAD~: updating HEAD
d27924e [email protected]{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

В первой строке указано, что HEAD 0 позиций назад (другими словами, текущая позиция) равно 3f6db14; он был получен сбросом до HEAD~. Во второй строке указано, что HEAD 1 позиция назад (другими словами, состояние до reset) - d27924e. Он был получен путем проверки конкретного фиксации (хотя это и не важно сейчас). Итак, чтобы отменить reset, запустите git reset [email protected]{1} (или git reset d27924e).

Если, с другой стороны, вы запустили некоторые другие команды с тех пор, когда вы обновили HEAD, то фиксация, которую вы хотите, не будет в верхней части списка, и вам нужно будет выполнить поиск по reflog.

Последнее замечание: может быть проще посмотреть на reflog для конкретной ветки, которую вы хотите отменить reset, скажем, мастера, а не HEAD:

$ git reflog show master
c24138b [email protected]{0}: merge origin/master: Fast-forward
90a2bf9 [email protected]{1}: merge origin/master: Fast-forward
[...]

У этого должно быть меньше шума, чем в общем HEAD reflog.

Ответ 2

Старый вопрос, и опубликованные ответы отлично работают. Я буду перебирать еще один вариант.

git reset ORIG_HEAD

ORIG_HEAD ссылается на фиксацию, которую ранее ссылался HEAD.

Ответ 3

Моя ситуация была несколько иной, я сделал git reset HEAD~ три раза.

Чтобы отменить это, я должен был сделать

git reset [email protected]{3}

чтобы вы могли сделать

git reset [email protected]{N}

Но если вы сделали git reset, используя

git reset HEAD~3

вам нужно будет

git reset [email protected]{1}

Как {N} представляет количество операций в Reflog. Как отметил Марк в комментариях.

Ответ 4

1. Используйте git reflog, чтобы обновить все ссылки.

2. git reset <id_of_commit_to_which_you_want_restore>