Как вернуть " git rm-r."?
я случайно сказал 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 rm . и нажал enter; а затем почувствовал, что мои кишки немного расслабились. К счастью, я не набрал git commit-m "" сразу же.
однако, следующая команда
git checkout .
восстановил все, и спас мою жизнь.