Мой репозиторий git как-то пошатнулся - я загрузил msysgit сегодня утром, и вместо имени ветки, отображаемого после текущего каталога, он говорит: «((ref: re ...))», «git status» сообщает обо всем как о новый файл, «git log» и «git reflog» сообщают мне «фатальная: плохая ревизия по умолчанию« HEAD »» и так далее.
Выполнение «git reflog --all» или «gitk --all» показывает мне, что остальная часть репозитория не повреждена, но похоже, что ветка, над которой я работал, только что исчезла, что объясняет, почему HEAD, похоже, не существует / указать на что угодно.
Я знаю, что git хранит все виды информации, и я предполагаю, что мои коммиты каким-то образом просто осиротели, поэтому есть ли какая-то команда, которая покажет мне эти коммиты, чтобы я мог сбросить для них HEAD?
РЕДАКТИРОВАТЬ: О, дорогой. Я обнаружил «git fsck», и «git fsck --full» сообщает «фатальный: объект 03ca4 ... поврежден». Что, черт возьми, я могу с этим поделать?
РЕДАКТИРОВАТЬ: О, дорогой, дорогой. Я проверил другую ветку, а затем попытался воссоздать исходную ветку с тем же именем, используя 'git checkout -b lostbranchname', и git сообщает: «Ошибка: невозможно разрешить ссылки refs / Heads / lostbranchname: нет ошибки, фатальный: сбой» заблокировать ссылку для обновления: нет ошибки ». «Нет ошибки» должно быть особенно неприятной ошибкой. Так что похоже, что он все еще висит, но не может быть использован и не может быть убит.
РЕДАКТИРОВАТЬ: Супер пупер, о боже. Я сделал кучу распаковки, переупаковки и замены вещей, как предлагается здесь: Как восстановить объекты Git, поврежденные в результате сбоя жесткого диска? , но теперь я получаю еще один хэш, который считается поврежденным, из-за чего-то столь же безобидного, как 'git status'. Я думаю, что все это залито из шланга. Git прекрасный и все такое, но я не должен иметь дело с такими вещами.
git checkout -b lostbranchname
- если вас интересует только имя ветки (а не ее содержимое), вы можете вручную удалить (или переименовать).git/refs/heads/lostbranchname
- это, надеюсь, поможет.Ответы:
Вместо того, чтобы оставлять это открытым, я думаю, что дам ответ на свой вопрос. Использование
git reflog --all
- хороший способ просматривать потерянные коммиты, а с помощью хэшей SHA1 вы можете восстановить историю.Однако в моем случае репозиторий был поврежден, поэтому это не помогло;
git fsck
может помочь вам найти и иногда исправить ошибки в самом репозитории.источник
[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&
(edit: представьте эти двойные обратные кавычки, где одиночные - экранирование здесь, похоже, не работает)С git 2.9.x / 2.10 (Q3 2016) вам больше не придется использовать
git reflog --all
,git reflog
будет достаточно.См. Commit 71abeb7 (3 июня 2016 г.) Седера Габора (
szeder
) .(Объединено Junio C Hamano -
gitster
- в коммите 7949837 , 06 июля 2016 г.)источник
Одна хорошая особенность git - обнаружение повреждений. Однако он не включает исправление ошибок для защиты от повреждения.
Я надеюсь, что вы переместили содержимое этого репозитория на другую машину или у вас есть резервные копии для восстановления поврежденных частей.
У меня нет опыта работы с git в Windows, но я никогда не видел такого поведения с git в Linux или OS X.
источник
Обычно
git reflog
результат меня сбивает с толку. Мне намного легче понять график коммитов изgit log --graph --reflog
. Переопределение формата для отображения только сводок фиксации также может упростить отслеживание графика:Из этого ясно, что
e3124bf
и6a7a52e
являются сиротами без ссылок, и есть контекст от их предков.источник
git reflog --all
не показывает их, так какgit log --graph --reflog
они были очень заметны ...