2013-03-18 3 views
5

Я хотел очистить свой рабочий каталог от некоторых незафиксированных файлов, но случайно запустил git reset --hard.Git commit потерял после сброса - hard. Не найден fsck, а не в reflog

Я понял, что потерял предыдущий (не нажал) фиксацию, поэтому я побежал git reset --hard ORIG_HEAD. Это не привело меня к моей утраченной битве.

Я побежал git reflog, но фиксации там не было. Я также побежал git fsck --lost-found, но в списке не было никаких коммитов, только несколько несвязанных капель и деревьев.

Поскольку я не могу найти ссылку на потерянную фиксацию (кроме .git/COMMIT_EDITMSG, которая все еще имеет соответствующее сообщение фиксации и список изменений), я не уверен, как это сделать, чтобы восстановить фиксацию.

Есть ли какой-нибудь способ вернуть потерянный результат, или я должен быть готов к всепобеждению?

+0

Почему, по вашему мнению, у вас была git-фиксация для ваших локальных изменений? git reset не потерял бы его. Если у вас были только незафиксированные изменения, они исчезли. – fche

+3

'git reset --hard' без аргумента commit-ish эквивалентен' git reset --hard HEAD', который не потеряет фиксации, нажал или не нажал. Он просто сбросит ваш индекс и рабочий каталог обратно до состояния последнего совершенного вами коммита, потеряв поэтапные и неустановленные (но еще не зафиксированные) изменения. «Git reset --hard ORIG_HEAD», вероятно, будет проблемой, в зависимости от того, какая именно последняя команда, которая фактически обновила ORIG_HEAD, и как давно это было, и что вы сделали между ними ... – twalberg

+0

Спасибо, потерянная фиксация была сделана примерно за полчаса до «git reset - hard». –

ответ

9

Не знаете, почему вы не можете найти свой коммит, так как комментарий @ twalberg о git reset --hard верен. Вот некоторые вещи, чтобы попытаться, однако.

У вас есть сообщение для фиксации, которую вы ищете (.git/COMMIT_EDITMSG). Если было написано COMMIT_EDITMSG, то конкретный фиксатор должен быть где-то. Выбираем некоторый текст из сообщения, которое довольно уникально и попробовать это:

git log -g --grep="<something specific from your commit message>"

Он будет проходить через reflog и найти совершает этот текст матча из потерянного сообщения фиксации лет.

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

git log --all --grep="<something specific from your commit message>"

После того, как вы нашли совершить хэш, вы можете проверить его, сделать новую ветвь, объединить его обратно в вашу текущую ветвь и т. д.

Однако, если все это не удается, вы можете попробовать посмотреть объекты, находящиеся в репозитории, но не являетесь частью какого-либо фиксации (например, добавлены в индекс, но не зафиксированы.) Этот ответ может помочь вам в этом:

https://stackoverflow.com/a/7376959/845716

+1

Спасибо, Роб. Я искал журналы git, прежде чем я разместил вопрос, но ваша последняя ссылка [«Undo git reset --hard»] (http://stackoverflow.com/a/7376959/845716), чтобы просмотреть все работаемые объекты!Не знаю, почему я не могу найти фиксацию. Я могу найти отдельные файлы. –

Смежные вопросы