Почему «пропали» коммиты?
Главная ошибка — использование
--amend
во время
rebase
.
Команда
git commit --amend
не создает новый коммит, а перезаписывает предыдущий.
Когда вы время интерактивного
rebase
на каждом шаге делаете
--amend
, вы по сути всё время заменяете один и тот же коммит. Остальные коммиты, которые Git должен был «применить» в процессе ребейза, просто исчезают, потому что их заменили.
Как делать правильно?
Во время
rebase -i
вместо
amend
нужно:
git add <файлы> # главное проиндексировать правки файлов
git rebase --continue # тут гит уже сам сделает git commit --no-edit
Вручную делать
git commit
перед
continue
имеет смысл только если вы хотите поменять ещё и сообщение коммита.
Как восстановить утерянные коммиты
Git не удаляет коммиты сразу. Они остаются в репозитории и доступны в
reflog
— журнале ссылок.
Их можно найти так:
git reflog
Затем восстановить ветку:
git reset --hard <хеш_из_reflog>
Вывод
Это не баг Git, а ожидаемое поведение. Просто
rebase + amend — взрывоопасная смесь, особенно если не до конца понимать, что происходит.