Неустановленные файлы пропали после сброса git --hard

Я попробовал git reset --hard HEAD@{n} от git reflog и я потерял все с моими текущими неподготовленными файлами:'(

неподготовленные файлы - последние git add Я сделал, до этого я пытался git reset до конца git commit,

И все мои файлы исчезли, я не могу вернуться к git add до последнего коммита:'(

9 ответов

Решение

Непонятно, потеряли ли вы файлы в рабочем каталоге или файлы в индексе. Вы говорите, что потеряли свои "неустановленные файлы", но потом упоминаете, что могли запустить "git add". "Неустановленные файлы" теряются навсегда.

Постановочные файлы могут быть восстановлены с

git fsck --full --unreachable --no-reflog

Для каждого добавленного файла будет потерянный объект BLOB-объекта, а для каждой записи каталога будет объект дерева. Вы восстановите изменения файла, выполнив

git cat-file -p SHA

Для каждого файла, который вы изменили

(master)$ vi bar (master)$ vi baz (master)$ vi foo (master)$ git add foo bar baz (master)$ git reset --hard HEAD HEAD is now at ead8fa2 initial (master)$ git fsck --full --unreachable --no-reflog Checking object directories: 100% (256/256), done. unreachable blob 0c29287001b29159f11c4e8a320bce7e9789c00b unreachable blob 1524d3478e3d0b92866a53239b10bcd4b3838c4d unreachable blob 97b724e770249816c61d8a526415986208ed7e15 // take a look at one of the objects (master)git cat-file -p 0c29287001b29159f11c4e8a320bce7e9789c00b changes for bar //Here, based on inspecting the output, I can determine that 0c29287 was the file "bar" (master) git cat-file -p 0c29287 > bar

(обратите внимание, что я не получил потерянных деревьев при тестировании, поэтому эта часть может не работать)

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

git read-tree SHA

Где SHA - это потерянный объект дерева для корневого дерева.

Все неустановленные / незафиксированные файлы будут удалены с помощью git reset --hard

Использование --hard не рекомендуется, так как эта опция удаляет ВСЕ непомеченные / незафиксированные файлы, вместо этого сначала следует спрятать, а затем использовать обычный сброс

Вместо

git reset --hard HEAD@{n}

Ты должен сделать

git stash
git reset HEAD@{n}

Затем ваш код сохраняется в стеке, и вы можете получить его снова, выполнив

git stash pop

Несмотря на то, что эта команда объединяет "спрятанные" изменения с их текущим HEAD (заначка реализована как ветвь), рекомендуется выполнять извлечение шкатулок на тех же коммитах, где были сгенерированы эти зомби.

Если кто-то сделал такую ​​же ошибку, как я git reset --hard перед добавлением неподготовленных файлов есть вероятность вернуть эти изменения обратно. Хотя эти файлы больше не доступны в репо, но некоторые из новых IDE поддерживают свою собственную историю. Как и в моем случае, я смог получить свои неотмеченные изменения из функции локальной истории Android Studio, которая находится в VCS. Направления отменить изменения

Низкий технический совет, который может быть полезен для некоторых. Если неустановленные / незафиксированные файлы, которые вы потеряли, откройте в вашем редакторе. Попробуйте отменить этот файл, и вы должны получить "предыдущие версии" файла из стека истории редакторов.

Подобно ответам Усамы Амджада и Джуанка.

Если вы использовали достаточно хорошую IDE/Editor:

  • Нажмите Ctrl+Z для каждого файла, который вы изменили,
  • Если вам повезет (как и мне), вы увидите всплывающее окно "Отменить перезагрузку с диска".
  • Хит "да".

Заметки:

  • Это сработало для моих неустановленных файлов
  • Я сделал это в PyCharm, поэтому он, вероятно, будет работать в других IDE на основе JetBrains / Idea.
  • Во время git reset, вероятно, нужно было открыть IDE
  • Во время git reset файлы, вероятно, нужно было открыть в окне редактора

Если кто-то ищет решение с использованием Pycharm IDE,

  • найти папку для удаленного файла,
  • щелкните правой кнопкой мыши и выберите "Показать историю",
  • На левой панели вы увидите историю изменений в этой папке.

Затем найдите удаленный файл, щелкните его правой кнопкой мыши и выберите "Вернуть". Удаленные файлы появятся в папке.

Если вы поставили файлы с git add, это все еще можно найти обратно. Но если файлы не подготовлены, я должен сказать, что нет никакого способа.:(

Просто запомни это git reset на самом деле небезопасно, особенно для неустановленных файлов.

Но если файлы действительно очень важны, я могу подумать, что вы можете прекратить изменять любые данные на вашем диске и попробовать восстановить диск с помощью таких инструментов, как finaldata, Если вам повезет, он может найти что-то обратно, потому что вы уже перезаписали некоторые файлы после git reset,

Тем не мение, Git действительно мощный и крутой инструмент, если вы знакомы с ним.

Еще один ответ "Если вы используете определенную IDE..."...

Если вы используете IntelliJ (или, я подозреваю, любые другие IDE JetBrains), вы можете:

  • Щелкните правой кнопкой мыши папку, в которой находились файлы.
  • Выберите «Местная история -> Показать историю».
  • Просмотрите элементы «Внешнее изменение», пока не найдете тот, который показывает все ваши удаленные файлы.
    • Похоже, что «reset --hard» отображается как удаление нескольких файлов в IntelliJ, поэтому в списке может быть несколько «Внешних изменений». Спуститесь к последнему с отметкой времени, когда вы сделали все остальное
  • Щелкните правой кнопкой мыши «Внешнее изменение» и нажмите «Вернуть».

Подробнее:https://blog.jetbrains.com/idea/2020/02/local-history-in-intellij-idea-may-save-your-life-code/

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

Другие вопросы по тегам