GIT говорит, что у меня нет коммитов в репо, как восстановить?

Использую Win7, 64-бит.

Я использую графический интерфейс GitExtensions, который отлично работает уже 3 месяца. Сегодня я сделал фиксацию, сразу же отправил репозиторий на свой сервер и выключился. Когда позже в тот же день я включил резервную копию и попытался сделать еще один (локальный) коммит, GitExtensions сказал мне, что я НИКОГДА не коммитил это репо, и показал 119 файлов с изменениями.

Очевидно, что-то поджарилось, поэтому моей первой мыслью было сделать пул из репозитория моего сервера. Угадай, что? Репозиторий сервера также показывает, что я НИКОГДА не делал этого.

Итак, моей следующей мыслью было то, что GitExtensions мне лжет. Поэтому я перешел на Tortoise GIT и сделал «Просмотр журнала». Угадай, что? GitExtensions не лжет. Tortoise GIT также показывает, что я НИКОГДА не фиксировал свое репо.

Когда я физически просматриваю репозиторий, я вижу все объектные файлы с разумными временными метками, охватывающими 3 месяца работы над этим проектом.

Как я могу заставить GIT восстановиться и понять, что у меня 3 месяца коммитов ЕЩЕ ТАМ? Единственные статьи, которые я видел, посвящены тому, как восстановить отдельные потерянные коммиты, которые должны использовать более раннюю фиксацию в качестве отправной точки. Очевидно, это мне не поможет, так как я не вижу НИКАКИХ коммитов.

Спасибо за вашу помощь.


person xpnctoc    schedule 03.01.2012    source источник


Ответы (3)


Во-первых, сделайте резервную копию вашего репозитория, чтобы любые неудачные попытки исправления не испортили его еще больше.

git fsck может помочь найти и исправить ошибки в репозитории.

git reflog может помочь вам определить бесхозные коммиты и восстановить историю.

Этот ответ об ошибке "плохая версия по умолчанию" может помочь .

Если fsck ничего не делает для вас, моей первой мыслью будет попытаться сбросить HEAD удаленного репозитория на одну фиксацию, а затем попробовать повторно клонировать.

person wadesworld    schedule 03.01.2012
comment
К вашему сведению, когда возникает описанная ошибка, git reflog фактически не сообщает, что коммитов нет, поэтому на самом деле это бесполезно. - person PandaWood; 22.07.2021

Проверьте, что вы получаете для «git log master» или любой другой ветки. Если это сработает, вы можете использовать «git bundle» для явного экспорта коммитов и всех связанных объектов. Промойте и повторите, чтобы спросить другие ветки в .git/refs.

Вероятно, было бы лучше перейти в командную строку, чтобы исправить это. Загрузите последнюю версию msysgit.

person Adam Dymitruk    schedule 03.01.2012

Папка .git все еще там? Если это так, то git хранит всю информацию. Если нет, то и возвращать нечего. Если нет, то ваш локальный git пропал. Если вы .git все еще там, попробуйте запустить git log и посмотреть, что он покажет.

Если ваша папка .git исчезла, вы сможете сделать «новый» клон со своего сервера, чтобы получить все.

person Ryan Gibbons    schedule 03.01.2012
comment
Да, папка .git есть, и я вижу все объекты, которые все еще там. Сделал журнал git и получил это сообщение: фатальный: неверная версия по умолчанию «HEAD». - person xpnctoc; 03.01.2012
comment
И я не могу клонировать с сервера. Удаленное репо демонстрирует такое же поведение. Это похоже на то, что инструменты с графическим интерфейсом, которые я использую, повредили коммит, а затем, поскольку я сразу же отправил его на сервер, это повреждение также было передано в репозиторий сервера. - person xpnctoc; 03.01.2012
comment
Итак, ваш инструмент с графическим интерфейсом выполнил принудительное нажатие, не спрашивая вас?! - person ThiefMaster; 03.01.2012
comment
Нет, в графическом интерфейсе есть возможность выполнить отправку сразу после фиксации. Обычно я включаю эту опцию, чтобы моя последняя работа сразу же сохранялась на двух разных машинах. Я предполагаю, что извлеченный урок состоит в том, чтобы держать репозиторий сервера позади локального, по крайней мере, на одно включение и выключение моей машины для разработки. - person xpnctoc; 03.01.2012