Большую часть времени недоступные коммиты находятся в reflog. Итак, первое, что нужно попробовать, это посмотреть reflog с помощью команды git reflog
(которая отображает reflog для HEAD
).
Возможно, что-то проще, если коммит был частью определенной ветки, которая еще существует, - это использовать команду git reflog name-of-my-branch
. Это работает также с пультом, например, если вы принудительно нажали.
Если ваши коммиты отсутствуют в вашем reflog (возможно, из-за того, что они были удалены сторонним инструментом, который не пишет в reflog), я успешно восстановил ветку, переустроив свою ветку в шаре коммит найден с помощью такой команды (он создает файл со всеми висячими коммитами):
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
Если вы должны использовать его более одного раза (или хотите сохранить его где-нибудь), вы также можете создать псевдоним с помощью этой команды ...
git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'
и используйте его с git rescue
Чтобы исследовать найденные коммиты, вы можете отобразить каждый коммит, используя некоторые команды для их просмотра.
Чтобы отобразить метаданные фиксации (автор, дата создания и сообщение фиксации):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Чтобы увидеть также различия:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Как только вы нашли свой коммит, создайте ветку для этого коммита с помощью:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560