Неустановленные файлы пропали после сброса 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 (и надеяться, что он все еще кэшировал изменения файлов). Проверьте, есть ли у вас где-нибудь список файлов, и надейтесь, что ваш редактор сохранил кэшированные копии.