Как вернуть "git rm -r ."?

Я случайно сказал git rm -r ., Как мне восстановиться после этого?

Я не совершал.

Я думаю, что все файлы были помечены для удаления, а также были физически удалены из моей локальной проверки.

РЕДАКТИРОВАТЬ: я мог (если бы я знал команду) вернуться к последнему коммиту. Но было бы намного лучше, если бы я мог просто отменить git rm -r ., Потому что я не совсем уверен, что я сделал после последнего коммита и до git rm -r .,

13 ответов

Решение
git reset HEAD

Должен сделать это. Если у вас нет незафиксированных изменений, которые вас волнуют, то

git reset --hard HEAD

должен принудительно сбросить все до вашего последнего коммита. Если у вас есть незафиксированные изменения, но первая команда не работает, сохраните незафиксированные изменения с помощью git stash:

git stash
git reset --hard HEAD
git stash pop

Я собрал несколько файлов и продолжил вносить изменения до следующего коммита, когда понял, что мне нужно вернуть некоторые из этих файлов. Вместо того, чтобы хранить и сбрасывать, вы можете просто извлекать отдельные файлы, которые вы пропустили / удалили, если хотите:

git checkout HEAD path/to/file path/to/another_file

Это оставляет ваши другие незафиксированные изменения без изменений.

Чтобы восстановить отдельные файлы или папки, можно использовать следующие

git reset -- path/to/file
git checkout -- path/to/file

Сначала будут воссозданы записи индекса для path/to/file и воссоздать файл, как это было в последнем коммите, т.е.HEAD,

Подсказка: можно передать хеш коммита обеим командам, чтобы воссоздать файлы из старого коммита. Увидеть git reset --help а также git checkout --help для деталей.

отменить мерзавца

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

отменить мерзавца

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

отменить мерзавца rm -rf

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changes включает в себя not staged changes, staged changes but not committed,

Обновить:

поскольку git rm . удаляет все файлы в этом и дочерних каталогах в рабочем оформлении, а также в индексе, вам необходимо отменить каждое из этих изменений:

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

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


Старый ответ, которого не было:

reset HEAD

сделает все возможное, и не удалит любые незафиксированные изменения, которые вы внесли в свои файлы.

после этого вам нужно повторить любой git add команды, которые вы поставили в очередь.

Если у вас не получится ничего из вышеперечисленного, вы можете получить данные, используя предложенное здесь: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

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

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file

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

git checkout <branch>@{"20 minutes ago"} <filename>

Если вы выполняете команду в репозитории с изменениями, которые не являются постановочными (поэтому и не зафиксированы), вы можете отменить операцию (снять с этапа удаления) с помощью команды

Итак, в двух словах, чтобы отменить тебе нужно только бежать git restore --staged .

В Git 2.23+ (август 2019 г.) правильную команду для восстановления файлов (и индекса) можно было бы использовать... git restore (не reset --hardили сбивающий с толкуgit checkoutкоманда)

То есть:

git restore -s=HEAD --staged --worktree -- .

Или его сокращенная форма:

git restore -s@ -SW -- .

Получить список коммитов

git log  --oneline

Например, стабильный коммит имеет хеш: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master

У меня была идентичная ситуация. В моем случае решение было:

git checkout -- .

У меня была точно такая же проблема: чистила папки, переставляла и перемещала файлы. Я вошел: Git RM . и нажмите ввод; и затем почувствовал, что мои кишки немного ослабли. К счастью, я не набрал git commit -m "" сразу.

Тем не менее, следующая команда

git checkout .

все восстановил и спас мне жизнь.

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