Предположим, что моя история идет тем путем:
A - B - C - D (ведущее устройство)
Если я делаю git reset B
, Я буду, добрался:
A - B (ведущее устройство)
Проблема, git log
теперь покажите мне только историю от до B, и я больше не вижу C и D.
Как я могу вернуться к D?
Вы должны быть в состоянии увидеть D с помощью git reflog
.
Смотрите, например, эту статью.
Единственный раз, когда коммиты действительно удаляются, это если вы выполните git 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 и выше).
Хорошо, нашел.
Вы можете использовать git reflog
.
Я не знал, для чего это нужно, но теперь вижу, что это журнал всех ссылок, на которые указывал HEAD.