Git испорченный мастер ветка

9

Я открываю свой репозиторий Git, используя gitExtensions в Windows 7 для проекта Visual Studio. Это внезапно пусто. Репозиторий существует, но все мои коммиты исчезли.

Я использую графический интерфейс, и я считаю, что это первый раз, когда я открыл его, так как они обновили его.

Я не уверен, что делать с возвращением моих коммитов.

Когда я печатаю

git log 

я получаю

фатальный: неверная версия по умолчанию 'HEAD'

Обновление
После просмотра /programming/1545407/recovering-broken-git-repository я попробовал

мерзавец

он вернулся:

ошибка: недопустимый HEAD
фатальный: свободный объект 36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (хранится в .git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671fcec97fbda31) поврежден

Фиксация возврата:

ошибка: невозможно разрешить ссылку HEAD: нет такого файла или каталога
фатально: невозможно заблокировать ссылку на HEAD

и ведение журнала мастер ветки возвращается

$ git log master предупреждение: игнорирование неверных ссылок refs / heads / master. предупреждение: игнорирование неработающих ссылок реф / головы / мастера. фатальный: неоднозначный аргумент 'master': неизвестная ревизия или путь не в рабочем дереве. Используйте '-', чтобы отделить пути от ревизий

Я просто продолжаю вставлять вещи, которые могут иметь отношение

$ git reflog master
предупреждение: игнорирование неработающих ref refs /heads / master.
предупреждение: игнорирование неработающих ссылок реф / головы / мастера.
фатальный: неоднозначный аргумент 'master': неизвестная ревизия или путь не в рабочем дереве.
Используйте '-', чтобы отделить пути от ревизий

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

Один день спустя:
так что я взял с собой своего товарища, он смог просмотреть журналы и сказал, что хэши в журналах не совпадают с объектами в папке. Он попытался сбросить ветку master в логи или что-то в этом роде, я немного растерялся. Надеюсь, что это полезно

MrJD
источник
1
@heavyd, пожалуйста, проверьте обновление
MrJD

Ответы:

3

Репозиторий существует, но все мои коммиты исчезли.

Что именно ты имеешь ввиду? Рабочее дерево все еще там? Существует .git/? Есть ли в нем файлы?

Сообщения, которые вы разместили, предполагают, что файл .git/HEADне существует. Он определяет ожидаемое состояние рабочего дерева (что вы проверили). Если этот файл исчез, Git не знает, где вы были.

Вы можете попробовать создать файл самостоятельно, с этим содержанием: ref: refs/heads/master

Если вы работали в другой ветке, просто замените «master» на имя ветки. Если бы вы не были на ветке, это было бы сложнее.

.git/logs/HEADзаписывает прошлые состояния HEAD с более поздними строками внизу. Эта строка примера показывает оформление заказа: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 1346938344 +0200 checkout: moving from master to MySuperBranch

SHA1s перед относятся к коммитам. Вы должны быть в состоянии найти их в журнале веток, например .git/logs/refs/heads/master.

Вывод git reflog, который вы дали, выглядит так, как будто refs/heads/masterотсутствует. Предполагается, что единственным его содержимым будет SHA1 последнего коммита (и новая строка). Например, последний SHA1 можно найти в конце журнала ветвления .git/logs/refs/heads/master.

Райнер Блум
источник
2

Если .git / HEAD существует и его содержимое ref: refs/heads/masterпроверяется, файл refs /head / master должен содержать sha1 последнего коммита.

Если этот файл был поврежден и содержит символы NULL, отредактируйте этот файл и поместите sha1 самого последнего коммита .git/logs/HEADили тот, что был перед последним коммитом.

Тогда делай git reset --hard 'sha1 of the commit that you selected'

Заки
источник
он действительно был полон символов NULL, поэтому я вставил в sha1 предыдущего коммита, но затем выполнение git reset привело к «error: update_ref сбой для ref 'HEAD': невозможно заблокировать ref 'HEAD': не удалось разрешить ссылку HEAD: неверный аргумент "
Фантабол
1

Похоже, ваш репо был поврежден. Самое простое, что можно сделать, - это восстановить ваше хранилище из резервной копии или повторно клонировать хранилище из исходного источника (при условии, что у вас не было тонны работы в хранилище).

Если ресотринг / клонирование не доступны, я бы порекомендовал прочитать Pro Git (бесплатная онлайн-книга или бумажная версия ). Вся книга очень информативна, но особенно взгляните на последнюю главу, чтобы понять, как Git работает внутри. Когда вы поймете, как работает Git, взгляните на инструкции Линуса по восстановлению поврежденных объектов .

heavyd
источник
Так что, к сожалению, я не копировал скрытые файлы, .git был скрыт. У меня нет достаточно времени, чтобы прочитать всю книгу, вы думаете, есть что-нибудь, что я мог бы попробовать?
MrJD
«Прочитайте книгу о внутренностях» может быть здравым общим советом, но это не помогает решить конкретную проблему и вопрос под рукой.
Бурхан Али
0

Пройдя некоторое время в Интернете, я наконец нашел это, и это сработало.

git fetch origin
git reset --hard origin/master
Leye Odumuyiwa
источник
Он получает какие-либо изменения origin(надеюсь, не слишком много работы выполняется локально), а затем вынуждает местное masterотделение соглашаться с удаленным. Осторожно, --resetзначит отменить любые локальные изменения! Кроме того, если бы он не был слишком сломан, просто git reset origin/masterвосстановил бы последнее известное (проверенное) состояние masterветки.
vonbrand