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

812

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

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

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

Я сделал 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 .сбрасывает рабочее пространство HEAD?

Homan
источник
16
если бы вы не поставили свои изменения после удаления, git checkout .все бы работало нормально.
Файзал
10
@faizal, и вы потеряете свои изменения, если вы это сделаете.
Василий Йоркин
1
Просто нажмите Ctrl-J в git gui на удаленном элементе.
ajeh
git checkout - магазин cc.properties / магазин README / cc.properties
Винод Паси
Смотрите этот ответ: quora.com/…
live-love

Ответы:

787

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

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

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

$ git config alias.unstage
reset HEAD

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

Нуфал Ибрагим
источник
5
Как вы делаете это для нескольких удаленных файлов? Запуск git reset HEAD << filename >> несколько раз был бы обременительным, какой-нибудь эффективный способ сделать это?
SubSul
70
git reset HEAD \*а затемgit checkout -- .
Нуфал Ибрагим
3
но я изменил файлы.
Цзян Я.Д.
@RauliRajande Вероятно, ваша ситуация отличается от описанной в оригинальном вопросе.
Нуфал Ибрагим
1
rm -r ./engines- ой. Теперь git reset engines; git checkout engines.
Крис
209

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

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

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

CB Bailey
источник
177

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

seddonym
источник
8
работает, только если файлы не были зафиксированы и отправлены.
mahen3d
23
У меня не сработало, git сказал, что не знает ни одного файла с таким именем, хотя файл отслеживается. Я также не фиксировал, я только по ошибке удалил файл, используя контекстное меню netbeans.
Зельфир Кальцталь
4
@ Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Иван Борщов
@ user3479125 Полагаю, ваш файл никогда не был зафиксирован. Что git statusоб этом сказать?
ki92
12
Состояние Git показывало зеленый «удаленный файл.ext», git checkout HEAD -- file.extпомогавший его восстановить.
Иван Борщов
144

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

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

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

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
PaoloC
источник
12
Я случайно удалил более 500 файлов, и это сработало, потому что сохранились все мои действительные изменения (первая строка - то, что я использовал). Спасибо.
Гай Лоу
1
Случайно удалил все содержимое репо сразу после успешной сборки. Первая команда спасла мой бекон.
MonaLisaOverdrive
2
Прежде чем это сработало бы для меня, мне пришлось бежать git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ян Данн
1
Очень полезно, хотел сохранить неотслеживаемые файлы, но избавиться от удаленных и измененных, просто изменил -d на -m для обработки измененных.
RaisinBranCrunch
5
Обратите внимание, что это не работает, если у вас есть пробелы в именах файлов / путях. Я думаю, что git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --будет работать.
parsley72
79

Поскольку вы делаете git checkout ., похоже, что вы пытаетесь восстановить свою ветку обратно в состояние последнего коммита.

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

Предупреждение

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

Пол Т
источник
39
Woww !! Осторожнее с этим !!!! Возможно, вы правы, но кто-то может запутаться и взорвать весь свой код. Было бы здорово, если бы вы добавили большее предупреждение.
santiagobasulto
3
Это именно то, что мне было нужно. Не взрывает весь ваш код - просто возвращает вас к вашему последнему коммиту.
Эндрю Хендри
2
Я закончил с сотнями пропавших файлов в одной точке. Это единственный практический способ решения проблемы. Спасибо!
Джонатан Бенн
66

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

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
Эд Горы
Отлично. git checkout HEAD^ path/to/filenameработал на меня, так как я не передал файл.
Моисей Ндеда
29

Вот команда, которая помогла мне на моем 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
Крис Хиншоу
источник
19
git checkout HEAD -- client/src/pp_web/index.cljs
Дастин Гетц
источник
18

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

git checkout $(git ls-files -d)

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

rickfoosusa
источник
намного лучше и проще, чем другие решения
joshi123
1
Если в некоторых файлах есть место, вы можете это сделать git ls-files -d | xargs -I{} git checkout "{}".
Жан Поль
17

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

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

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

$ git reset HEAD . 

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

$ git checkout .

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

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

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

это относится к случаям, когда вы использовали

git checkout -- .

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

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

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

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

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

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

$ git checkout -- file.cpp
user2453404
источник
4

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

git stash
git stash clear
git clean 
стог
источник
Поместить его в стек хранения - это не решение. Это взломать
Роберт Долька,
2
Это хорошее решение, потому что вы можете удалить его из тайника. Если взломать или нет, это дело вкуса. Вся идея заначки - умный взлом.
Эйно Мякитало
@ EinoMäkitalo рад, что это может помочь вам :)
Рик
Мне нравится этот подход больше всего из перечисленных
ckapilla
3

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

 git checkout ./pathToDir/*
ППБ
источник
3

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

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

$ git checkout -- <file>

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

$ git ls-files --deleted

Если удаление было зафиксировано , найдите коммит, где оно произошло, а затем восстановите файл из этого коммита.

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

Это должно дать вам что-то вроде c46e81aa403ecb8a0f7a323a358068345, теперь используйте commit # здесь

$ git checkout <commit>^ -- <file>

Примерно так: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

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

$ git log --diff-filter=D --summary

Если вы хотите просто отобразить список файлов:

git log --diff-filter=D --summary | grep "delete mode"
Мухаммед Солиман
источник
2

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

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

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

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

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

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

Василий Широчук
источник
1

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

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

2. Возврат к этому коммиту с использованием:

    git revert <commit id> 

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

Ашутош С
источник
Это работает, если вы уже зафиксировали свои изменения.
живи-люби
1

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

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

git checkout ./*
Энрике Флоренсио
источник
2
К вашему сведению ... эта команда удалила все мои рабочие файлы и не восстановила удаленный файл
..
Вот почему вы используете эту команду для СБРОСА вашего рабочего пространства. Я думал, что это само за себя.
Энрике Флоренсио
1
Эта команда не работает, потому что если файл удален, он не будет перехвачен ./*.
Жан Поль
@JeanPaul, может быть, я неправильно понимаю, но это вернуло мое рабочее пространство в исходное состояние (удаленный файл теперь присутствует).
Марк
@Marc Это может сработать, но только если в каталоге нет видимых файлов, так как в противном случае ./*bash будет расширен до совпадения этих файлов перед отправкой в ​​git.
Жан Поль,
0

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

theEUG
источник
-1

У меня была та же проблема, и ни один из ответов, которые я здесь пробовал, также не помог мне. Я использую Intellij, и я извлек новую ветку, git checkout -b minimalExampleчтобы создать «минимальный пример» для новой ветки некоторой проблемы, удалив кучу файлов и изменив кучу других в проекте. К сожалению, несмотря на то, что я не зафиксировал никаких изменений в новой ветви «минимального примера», когда я снова извлек свою «оригинальную» ветку, все изменения и удаления из ветви «минимального примера» произошли в оригинальная "ветка" тоже (или так появилась). По git statusудаленным файлам просто пропали из обеих веток.

К счастью, даже несмотря на то, что Intellij предупредил меня, что «удаление этих файлов не может быть полностью восстановлено», я смог восстановить их (на минимальной ветке примера, из которой они были фактически удалены), щелкнув правой кнопкой мыши по проекту и выбрав Local History > Показать историю (а затем восстановить на самом последнем элементе истории, который я хотел). После того, как Intellij восстановил файлы в ветке «минимального примера», я переместил ветку в origin. Затем я переключился на свою «оригинальную» локальную ветку и побежал, git pull origin minimalExampleчтобы вернуть их и в «оригинальную» ветку.

geneSummons
источник