Предположим, моя история такова:
A - B - C - D (мастер)
Если я сделаю git reset B, я получу:
git reset B
A - B (мастер)
Проблема в том, что git log теперь показывает мне только историю от А до Б, и я больше не вижу С и D.
git log
Как я могу вернуться к D?
Вы должны увидеть D с git reflog.
git reflog
См. Эту статью , например .
Единственное время, когда фактически удаляются коммиты, это если вы нажмете gc --prune (так что будьте осторожны с этим!). Если вы запустите git reflog прямо сейчас в репозитории, в котором вы работали, вы увидите множество изменений, которые выглядят примерно так:
Единственное время, когда фактически удаляются коммиты, это если вы нажмете gc --prune (так что будьте осторожны с этим!).
Если вы запустите git reflog прямо сейчас в репозитории, в котором вы работали, вы увидите множество изменений, которые выглядят примерно так:
c5c3a82... HEAD@{0}: pull origin featureB: Merge made by recursive. 49d0608... HEAD@{1}: reset --hard HEAD^: updating HEAD 3ed01b1... HEAD@{2}: pull origin featureA: Merge made by recursive. 49d0608... HEAD@{3}: pull origin bugfixJ: Merge made by recursive. 854d44e... HEAD@{4}: commit: Add more cowbell to foo.c 6dbc22d... HEAD@{5}: pull origin bugfixI: Merge made by recursive. 9bdb763... HEAD@{6}: commit: Remove weevils 8518f9d... HEAD@{7}: checkout: moving from wickedfeature to master
Эти строки можно разбить на 4 части: совершить хэш, указатель фиксации, действие, и дополнительная информация. Если бы мы хотели вернуть утраченный коммит в HEAD@{1}, мы могли бы просто git reset --hard HEAD@{2}. Теперь наша текущая ветвь (и рабочая копия) установлены в состояние хранилища, прежде чем мы сделали сброс. Если бы мы просто хотели посмотреть, что это за состояние, мы могли бы git checkout -b temp HEAD@{2} (или git checkout HEAD@{2}, если у вас git 1.5.0 и выше).
Эти строки можно разбить на 4 части:
Если бы мы хотели вернуть утраченный коммит в HEAD@{1}, мы могли бы просто git reset --hard HEAD@{2}. Теперь наша текущая ветвь (и рабочая копия) установлены в состояние хранилища, прежде чем мы сделали сброс.
HEAD@{1}
git reset --hard HEAD@{2}
Если бы мы просто хотели посмотреть, что это за состояние, мы могли бы git checkout -b temp HEAD@{2} (или git checkout HEAD@{2}, если у вас git 1.5.0 и выше).
git checkout -b temp HEAD@{2}
git checkout HEAD@{2}
Хорошо, нашел его.
Вы можете использовать git reflog.
Я не знал, для чего это, но теперь я вижу, что это журнал всех ссылок, на которые указывал HEAD.