November 30, 2012

Восстановление коммита в Git репозитории

Сегодня случилось страшное. Я потерял порядка 2-х дней работы сделав git rebase для перемещения бранча в Git репозитории. Тем самым "потерял" код. В кавычках потому что надежда еще есть. Мне светило переписать все заново, а это для меня в разы хуже чем писать в первый раз. Но, мне удалось найти способ восстановить потерянное, а на сэкономленное время расскажу вам как это делать, заодно и для себя будет заметка на будущее.



Для демонстрации я создал тестовый репозиторий и сделал в нем 4 коммита. Аналогичная ситуация произошла и со мной.

Теперь мы перемещаем master чтобы он ссылался на коммит с названием "3rd commit".

















"4th commit" пропадет и будет это выглядеть следующим образом.

Можно начинать паниковать... Собственно, раз вы это читаете, то скорее всего уже в панике и в поисках решения :).

Для решения опускаемся ниже, в консоль. Заходим в нужную папку и выполняем команду git reflog.




Здесь можно увидеть кое какую интересную информацию, но нам нужен SHA хеш нашего утерянного коммита. Его можно найти вот в этой строке:
4ce165e HEAD@{6}: commit: 4th commit

Вот он 4ce165e, вернее это короткая версия SHA1 хеша. Чтобы посмотреть что в этом коммите используем
git show 4ce165e

и когда убедились что это то что вы ищете
git checkout 4ce165e

Надеюсь это сэкономит кому-нибудь пару часов или дней работы. Happy coding!

Полезная литература:

4 comments:

  1. Блин, а если несколько коммитов пропало? Восстанавливаются… хм… не все изменения восстанавливаются.

    ReplyDelete
  2. Спасибо. Очень помогло.
    Что за приложение вы используете на самом первом скриншоте?

    ReplyDelete
    Replies
    1. Давно было, кажется это Git-X и их существовало 2 разных версии, одна из них лучше. Сейчас использую Source Tree и пробую новый Tower.

      Delete