git. отвалилась голова. Я не заметил и сделал коммиты в безымянную ветку. Как вернуть?

Несколько раз откатывал состояние рабочей области к разным коммитам. Потом вернулся к самому свежему. Но так как делал это не в консоли, то не заметил, что вернулся не к ветке master, а к её коммиту по хешу. В итоге HEAD отвалился. Я не заметил, что гит предупредил:

You are in 'detached HEAD' state

и закоммитил несколько раз. Теперь заметил и у меня вот такая ситуация:

$ git log
commit 875a30059dcba645438a23dd466451fd0405d894 (HEAD)
  
commit d26a0d8845ac72b125c47c3dfb49b289df6bc893
    
commit 27ce01b5b84b5c5eeeb20a13f154134e70dcaa4c (master)

При попытке вернуться в мастер, последние два коммита пропадают. Как мне их вернуть внутрь ветки? P.S. Не пушил. Ни каких других веток в этом репо нет.


Ответы (2 шт):

Автор решения: Евгений Николаевич Олейник

Часа 4 изучал разные способы решения. Но остановился на ручном передвижении указателя ветки master к нужному коммиту (это работает если предварительно не шатать репозиторий разными командами по переписыванию истории).

Для этого я открыл файл .git\refs\heads\master и заменил хеш текущего коммита на хеш самого свежего (в моём случае 27ce01b на 875a300) и моментально указатель мастера переместился. Теперь и master и HEAD указывают на один коммит, но башка ещё оторвана. Однако все коммиты и файлы на месте. Теперь достаточно сделать чекаут в мастер из консоли и репозиторий в порядке! Возможно это опасно, но просто и понятно. Рекомендую перед экспериментами с локальным репозиторием скопировать его в другую папку.

→ Ссылка
Автор решения: Alexey Ten

В вашем случае самое простое

git checkout master
git merge --ff 875a30059dcba645438a23dd466451fd0405d894
→ Ссылка