Git Detached HEAD потерял данные

Каким-то образом я закончил с отделенной головой. Я сделал несколько коммитов, и они появились в моей истории коммитов как HEAD (но master было несколько коммитов позади). Затем я попытался починить отсоединенную головку, проверив master,

Теперь я не вижу своих предыдущих коммитов в отделенной ГОЛОВЕ. Они ушли навсегда?

3 ответа

Решение

Проверь рефлог (git reflog).

[Мои предыдущие коммиты] исчезли навсегда?

Нет. Хотя эти коммиты не отображаются на выходе git logони все еще существуют в недрах вашего хранилища, и вы все равно можете их извлечь; в таких случаях reflog - это ваша сеть безопасности.

Без дополнительной информации трудно предоставить последовательность команд, которая определенно избавит вас от проблем, но вы можете сделать следующее:

  1. Откройте рефлог вашего master ветвь, запустив

    git reflog master
    
  2. Используя сообщения коммитов в качестве подсказок, определите коммит, который вы хотите master ветвь для указания; запишите (на листе бумаги) номер соответствующей записи в master reflog. Выход из журнала.

  3. Удостовериться master текущая ветка:

    git checkout master
    
  4. Бежать

    git reset master@{<n>}
    

    где <n> обозначает номер записи reflog, соответствующий коммиту интереса.

После этого, master должен указывать на желаемый коммит, как до того, как вы закончили с отсоединенной головой.

Если вы не используете версию Git каменного века, то распечатанные сообщения довольно хороши (это от 2.2.0, но я думаю, что так было с 1.8.X или более ранней версии).

Когда вы впервые вошли в отдельное состояние головы, вам следовало точно сказать, как создать ветку для работы.

Примечание: отметьте "ГОЛОВА ~1".

Вы находитесь в состоянии "отсоединенная ГОЛОВА". Вы можете осмотреться, внести экспериментальные изменения и зафиксировать их, а также можете отменить любые коммиты, сделанные вами в этом состоянии, не влияя на какие-либо ветви, выполнив другую проверку.

Если вы хотите создать новую ветку для сохранения созданных вами коммитов, вы можете сделать это (сейчас или позже), снова используя -b с командой checkout. Пример:

git checkout -b new_branch_name

И когда вы покинули отдельное состояние головы, вы должны были получить это сообщение

Предупреждение: вы оставляете 1 коммит, не связанный ни с одной из ваших веток:

27c4eec foo

Если вы хотите сохранить их, создав новую ветку, это может быть хорошим временем для этого:

git branch new_branch_name 27c4eec

Если вы не видели этих сообщений, вам следует рассмотреть возможность обновления вашей версии Git.

Если вы видели эти сообщения, просто следуйте инструкциям, которые они распечатали.

Другие вопросы по тегам