Git
Reflog - восстановление коммитов, не показанных в git log
Поиск…
замечания
Рефлог Git записывает позицию HEAD (ref для текущего состояния репозитория) каждый раз, когда он изменяется. Как правило, каждая операция, которая может быть разрушительной, включает в себя перемещение указателя HEAD (поскольку, если что-либо изменится, в том числе и в прошлом, хэш хэша будет изменяться), поэтому всегда можно вернуться к более старому состоянию перед опасной операцией , найдя правильную линию в рефлоге.
Объекты, на которые не ссылаются никакие ссылки, обычно собирают мусор в течение ~ 30 дней, поэтому reflog не всегда может помочь.
Восстановление от плохой перестановки
Предположим, что вы начали интерактивную перезагрузку:
git rebase --interactive HEAD~20
и по ошибке вы раздавили или сбросили некоторые коммиты, которые вы не хотели потерять, но затем завершили перезагрузку. Чтобы восстановить, выполните git reflog
, и вы можете увидеть некоторые результаты следующим образом:
aaaaaaa HEAD@{0} rebase -i (finish): returning to refs/head/master
bbbbbbb HEAD@{1} rebase -i (squash): Fix parse error
...
ccccccc HEAD@{n} rebase -i (start): checkout HEAD~20
ddddddd HEAD@{n+1} ...
...
В этом случае последнее commit, ddddddd
(или HEAD@{n+1}
) является верхушкой ветви pre-rebase . Таким образом, чтобы восстановить эту фиксацию (и все родительские коммиты, включая те, которые были случайно раздавлены или сброшены), выполните:
$ git checkout HEAD@{n+1}
Затем вы можете создать новую ветку при этом фиксации с помощью git checkout -b [branch]
. Дополнительную информацию см. В разделе « Ветвление» .