Как отменить 'git reset'? - PullRequest
1080 голосов
/ 24 марта 2010

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

git reset HEAD~

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

Ответы [ 4 ]

2024 голосов
/ 28 марта 2010

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

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.

133 голосов
/ 25 января 2016

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

git reset ORIG_HEAD

ORIG_HEAD ссылается на коммит, на который HEAD ссылался ранее.

39 голосов
/ 15 августа 2014

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

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

git reset HEAD@{3}

так что вы должны быть в состоянии сделать

git reset HEAD@{N}

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

git reset HEAD~3

вам нужно будет сделать

git reset HEAD@{1}

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

13 голосов
/ 05 июля 2018

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

2. git reset <id_of_commit_to_which_you_want_restore>

3 В следующий раз избегайте этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...