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

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

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

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

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

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 .

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