Git восстановить удаленный файл, где не было сделано коммит после удаления

665

Я удалил несколько файлов.

Я еще НЕ совершал.

Я хочу reset мое рабочее пространство для восстановления файлов.

Я сделал git checkout ..

Но удаленные файлы все еще отсутствуют.

И git status показывает:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

Почему не git checkout . reset рабочее пространство HEAD?

  • 13
    если вы не сделали свои изменения после удаления, git checkout . работал бы нормально.
  • 7
    @faizal, и вы потеряете свои изменения, если вы это сделаете.
Показать ещё 1 комментарий
Теги:

20 ответов

645
Лучший ответ

Вывод подскажет вам, что вам нужно сделать. git reset HEAD cc.properties и т.д.

Это остановит работу rm. После этого запуск git status снова скажет вам, что вам нужно сделать git checkout -- cc.properties, чтобы вернуть файл.

Обновление: У меня это в моем файле конфигурации

$ git config alias.unstage
reset HEAD

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

  • 3
    Как вы делаете это для нескольких удаленных файлов? Запуск git reset HEAD << filename >> несколько раз был бы обременительным, какой-нибудь эффективный способ сделать это?
  • 47
    git reset HEAD \* и затем git checkout -- .
Показать ещё 6 комментариев
173

Вы выполнили удаление, поэтому вам нужно сделать:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . проверяет только из индекса, в котором удаление уже выполнено.

  • 93
    git checkout HEAD fileToDelete делает git checkout HEAD fileToDelete дело.
141

Просто сделайте git checkout path/to/file-I-want-to-bring-back.txt

  • 5
    работает, только если файлы не были зафиксированы и отправлены.
  • 13
    У меня не сработало, git сказал, что не знает ни одного файла с таким именем, хотя файл отслеживается. Я также не фиксировал, я только по ошибке удалил файл, используя контекстное меню netbeans.
Показать ещё 4 комментария
118

Чтобы восстановить все неустановленные удаления одновременно, без указания каждого отдельного пути:

git ls-files -d | xargs git checkout --

Чтобы восстановить все поставленные удаления сразу, автоматически, без указания каждого отдельного пути:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
  • 8
    Я случайно удалил более 500 файлов, и это сработало, потому что сохранились все мои действительные изменения (первая строка - то, что я использовал). Благодарю.
  • 1
    Случайно удалил все содержимое репо сразу после успешной сборки. Первая команда спасла мой бекон.
Показать ещё 6 комментариев
74

Так как вы делаете git checkout ., похоже, что вы пытаетесь восстановить ветвь назад до последнего состояния фиксации.

Вы можете достичь этого с помощью git reset HEAD --hard

Внимание!

Выполняя это, вы можете удалить все свои последние изменения и отключить свои изменения, например, вы можете потерять работу. Это может быть то, что вы хотите, но проверьте документы, чтобы убедиться.

  • 38
    Woww !! Осторожнее с этим !!!! Вы можете быть правы, но кто-то может запутаться и взорвать весь свой код. Было бы круто, если бы вы добавили большее предупреждение.
  • 2
    Это именно то, что мне было нужно. Не взрывает весь ваш код - просто возвращает вас к вашему последнему коммиту.
Показать ещё 1 комментарий
43

если вы использовали

git rm filename

чтобы удалить файл тогда

git checkout path/to/filename

не работает, так что в этом случае

git checkout HEAD^ path/to/filename

должно сработать

  • 2
    Мне нравится этот ответ. Нет сомнений, что вы затрагиваете только тот файл, который вы удалили. 1) git checkout path / to / filename 2) git checkout - путь / to / filename
  • 0
    отличное и простое решение
28

Вот команда, которая помогла мне на моем mac. Я пробовал несколько других решений, но они не работали для меня.

Git версия на OSX Mavericks

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

Команда

git checkout HEAD -- path/to/file/file.cc
17
git checkout HEAD -- client/src/pp_web/index.cljs
14

Если вы хотите восстановить сразу все файлы

Не забудьте использовать этот период, потому что он сообщает git, чтобы захватить все файлы.

Эта команда будет reset голова и нести все изменения:

$ git reset HEAD . 

Затем запустите это, чтобы восстановить все файлы:

$ git checkout .

Затем, выполняя статус git, вы получите:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
  • 0
    Это своего рода простейшее решение, которое работает с кучей файлов (скажем, вы удалили несколько файлов / папок). хорошая работа чувак +
12

Используйте git ls-files для извлечения удаленных (-d) или измененных (-m) файлов.

git checkout $(git ls-files -d)

см. Как я могу восстановить только измененные файлы в git checkout?

  • 0
    Благослови свое сердце! Ты только что спас меня.
  • 0
    намного лучше и проще, чем другие решения
Показать ещё 2 комментария
7

Вы можете увидеть это

который используется для случаев, когда вы использовали

git checkout -- .

прежде чем что-то совершить.

Вы также можете избавиться от созданных файлов, которые еще не созданы. И ты не хочешь их. С помощью:

git reset -- .
  • 0
    Вы не сообщили полностью ответ, который вы скопировали. На самом деле git checkout -- . не помогает восстановить удаленные файлы и эквивалентно тому, что пытался запросить: git checkout . , Часть, которая может работать, это та, которую вы не скопировали: git checkout <file_path> .
6

Нашел этот пост, ища ответы на вопрос о том, как удалить файл, который был удален в моей рабочей директории после слияния с другой веткой. После слияния не было совершено никаких обязательств. Поскольку это было слияние в процессе, я не мог просто добавить его обратно, используя:

$ git reset <commitid#-where-file.cpp-existed> file.cpp

Мне пришлось сделать еще один шаг в дополнение к reset, чтобы вернуть файл:

$ git checkout -- file.cpp
4

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

git stash
git stash clear
git clean 
  • 0
    Поместить его в стек хранения - это не решение. Это взломать
  • 1
    Это хорошее решение, потому что вы можете удалить его из тайника. Если взломать или нет, это дело вкуса. Вся идея заначки - умный взлом.
Показать ещё 2 комментария
3

если вы ищете удаленный каталог.

 git checkout ./pathToDir/*
1

Вы можете сбросить рабочее пространство (и восстановить удаленные файлы)

git checkout ./*

ВНИМАНИЕ: передайте любую работу, которую хотите сохранить в первую очередь.

  • 2
    К вашему сведению ... эта команда удалила все мои рабочие файлы и не восстановила удаленный файл.
  • 0
    Вот почему вы используете эту команду для СБРОСА вашего рабочего пространства. Я думал, что это само за себя.
Показать ещё 4 комментария
1

Для меня работала git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Например git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(выполняется в ветке, в которую мы хотим включить файл)

После выполнения этой команды восстановленный файл будет существовать в исходном местоположении (которое должно быть отправлено)

  • 0
    и / или просто git checkout master path/to/the/file.bin так что вы можете просто восстановить этот файл без потери каких-либо других изменений, которые вы могли сделать. PS: это должен быть принятый ответ ...
1

Если вы установили ToroiseGIT, просто выберите пункт "Revert..." для всплывающего меню родительской папки.

0

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

$ git config alias.unstage
$ git checkout HEAD^ *
0

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

-1

1.Найдите это конкретное сообщение, к которому вы хотите вернуться, используя:

   git log
This command will give you a list of commits done by you .

2. Повторите попытку с помощью:

    git revert <commit id> 

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню