Как вернуться к последнему фиксации в истории после того, как я использовал git reset, чтобы перейти к более раннему набору изменений?

Предположим, что моя история идет следующим образом:

A - B - C - D (мастер)

Если я сделаю git reset B, я получу:

A - B (мастер)

Проблема в том, git log теперь показывает мне только историю от A до B, и я больше не вижу C и D.

Как я могу вернуться к D?

Ответ 1

Вы должны увидеть D с git reflog.

См. статью .

Единственные коммиты времени фактически удаляются, если вы git gc --prune (так что будьте осторожны с этим!).

Если вы запустили git reflog прямо сейчас в репозитории, в котором вы работали, вы увидите много изменений, которые выглядят примерно так:

c5c3a82... [email protected]{0}: pull origin featureB: Merge made by recursive.
49d0608... [email protected]{1}: reset --hard HEAD^: updating HEAD
3ed01b1... [email protected]{2}: pull origin featureA: Merge made by recursive.
49d0608... [email protected]{3}: pull origin bugfixJ: Merge made by recursive.
854d44e... [email protected]{4}: commit: Add more cowbell to foo.c
6dbc22d... [email protected]{5}: pull origin bugfixI: Merge made by recursive.
9bdb763... [email protected]{6}: commit: Remove weevils
8518f9d... [email protected]{7}: checkout: moving from wickedfeature to master

Эти строки можно разбить на 4 части:

  • commit hash,
  • зафиксировать указатель,
  • действие,
  • и дополнительную информацию.

Если мы хотим вернуть фиксацию, которая была потеряна в [email protected]{1}, мы могли бы просто git reset --hard [email protected]{2}.
Теперь наша текущая ветка (и рабочая копия) устанавливается в состояние репозитория до того, как мы сделали reset.

Если бы мы хотели просто посмотреть, что это за состояние, мы могли бы git checkout -b temp [email protected]{2} (или git checkout [email protected]{2}, если у вас есть git 1.5.0 и выше).

Ответ 2

Хорошо, нашел.

Вы можете использовать git reflog.

Я не знал, для чего это нужно, но теперь я вижу, что это журнал всех ссылок, на которые указывает HEAD.