неустановленные файлы исчезли после git reset --hard

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

неустановленные файлы являются последними git add Я сделал, до этого я пытался git reset до последнего git commit.

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

5 ответов


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

Staged файлы могут быть восстановлены с помощью

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

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

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

git read-tree SHA

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


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

использование --hard не рекомендуется, так как этот параметр выводит все unstaged / uncommited файлы, вместо этого вы должны притон сначала, а затем используйте обычный сброс

вместо

git reset --hard HEAD@{n}

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

git stash
git reset HEAD@{n}

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

git stash pop

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


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

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

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

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


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


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