9

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

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

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

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

git log 

я получил

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

Обновить
Посмотрев на https://stackoverflow.com/questions/1545407/recovering-broken-git-repository я попробовал

мерзавец

он вернулся:

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

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

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

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

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

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

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

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

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

4 ответа4

2

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

Что именно ты имеешь ввиду? Рабочее дерево все еще там? .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'

0

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

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

0

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

git fetch origin
git reset --hard origin/master

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .