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

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

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

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

EDIT: я мог (если бы знал команду) вернуться к последней фиксации. Но было бы намного лучше, если бы я мог просто отменить git rm -r .. Потому что я не совсем уверен, что я сделал после последнего коммита и перед git rm -r ..

Ответ 1

git reset HEAD

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

git reset --hard HEAD

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

git stash
git reset --hard HEAD
git stash pop

Ответ 2

I git -rm'd несколько файлов и продолжал вносить изменения до моего следующего коммита, когда понял, что мне нужны некоторые из этих файлов. Вместо stash и reset вы можете просто проверить отдельные файлы, которые вы пропустили/удалили, если хотите:

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

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

Ответ 3

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

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

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

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

Ответ 4

Update:

Так как 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, которые вы поставили в очередь.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Получить список commit

git log  --oneline

Например, Stable commit имеет hash: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

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

Ответ 9

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

git checkout -- .

Ответ 10

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

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

git checkout .

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