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


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

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

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

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

11 311

11 ответов:

git reset HEAD

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

git reset --hard HEAD

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

git stash
git reset --hard HEAD
git stash pop

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

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

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 rm

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

отменить git rm-r

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

отменить git 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.

Get list commit

git log  --oneline

например, стабильная фиксация имеет хэш:45ff319c360cd7bd5442c0fbbe14202d20ccdf81

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

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

git checkout -- .

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

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

git checkout .

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