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?


16
якби ви не влаштували зміни після видалення, git checkout .добре працювали б.
фазал

10
@faizal, і ви втратите свої зміни, якщо це зробите.
Василь Йоркін

1
Просто натисніть Ctrl-J в git gui на видаленому елементі.
ajeh

git checkout - магазин cc.properties / магазин README / cc.properties
Pasi

Дивіться цю відповідь: 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 <<namename>> кілька разів був би громіздким, будь-який ефективний спосіб зробити це?
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 . виходить лише з індексу, де видалення вже було здійснено.


177

Просто роби git checkout path/to/file-I-want-to-bring-back.txt


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 показав зелений "delated file.ext", який git checkout HEAD -- file.extдопоміг відновити його.
Іван Борщов

143

Щоб відновити всі нестандартні видалення відразу, автоматично, не вказуючи кожен окремий шлях:

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

Щоб відновити всі поетапні видалення відразу, автоматично, не вказуючи кожен окремий шлях:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --

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 --, спрацює.
петрушка72

79

Оскільки ви це робите git checkout ., схоже, ви намагаєтесь відновити свою гілку до останнього стану фіксації.

Ви можете досягти цього за допомогою a 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 - шлях / до / ім'я файлу
Ed of the Mountain

Відмінно. 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


18

Використовуйте git ls-filesдля оформлення видалених (-d) або модифікованих (-m) файлів.

git checkout $(git ls-files -d)

див. Як я можу відновити лише змінені файли під час оформлення git?


набагато кращі та простіші за інші рішення
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'.

Це наче найпростіше рішення і працює для купі файлів (скажімо, ви видалили кілька файлів / папок). хороша робота чувак +
Gkiokan

9

Ви можете бачити це?

це стосується випадків, коли ви використовували

git checkout -- .

перш ніж щось зробити.

Можливо, ви також хочете позбутися створених файлів, які ще не створені. А ти їх не хочеш. З:

git reset -- .

Ви не повідомили повністю про відповідь, яку ви скопіювали. Насправді git checkout -- .не допоможе відновити вилучені файли і еквівалентно тому , що намагався Аскер: git checkout .. Частина , яка може працювати це один ви не скопіювали: git checkout <file_path>.
Жан Пол

6

Знайшов цю публікацію, шукаючи відповіді про те, як видалити файл, який був видалений з мого робочого каталогу після злиття з іншої гілки. Після злиття ще не було зроблено жодних зобов'язань. Оскільки це було злиттям, я не міг просто додати його за допомогою:

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

Мені довелося зробити ще один крок на додаток до скидання, щоб повернути файл назад:

$ git checkout -- file.cpp

4

Якщо ви не зробили жодних змін, все, що вам потрібно зробити, - це приховати ці зміни, і ви повернетесь до останнього робочого зобов’язання.

git stash
git stash clear
git clean 

Поміщення його на стек-скрипт не є рішенням. Це злом.
Роберт Долька

2
Це гарне рішення, оскільки його можна видалити зі сховища. Якщо хакер чи ні, справа смаку. Вся ідея схованки - це розумний злом.
Ейно Макітало

@ EinoMäkitalo радий, що це може вам допомогти :)
Rick

Мені найбільше подобається цей підхід із усіх перелічених
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Тепер використовуйте фіксувати # тут

$ 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: це має бути прийнята відповідь ...
Едоардо

1

Якщо ви встановили ToroiseGIT, просто виберіть пункт меню "Повернути ..." для спливаючого меню батьківської папки.


1

1.Знайдіть той конкретний документ, до якого ви хочете повернути, використовуючи:

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

2. Поверніться до цього зобов'язання, використовуючи:

    git revert <commit id> 

Тепер ви маєте місцеві відділення, зокрема всі файли


Це працює, якщо ви вже здійснили зміни.
live-love

1

ОБЕРЕЖНО: спочатку виконайте будь-яку роботу, яку ви хочете зберегти.

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

git checkout ./*

2
FYI ... ця команда видалила всі мої робочі файли і не відновила видалений файл. Обережно
hendr1x

Ось чому ви використовуєте цю команду для відновлення робочої області. Я думав, що це само собою зрозуміло.
Анріке Флоренсіо

1
Ця команда не працює, тому що якщо файл буде видалений, він не буде захоплений ./*.
Жан Пол

@JeanPaul, можливо, я нерозумію, але це ставить мою робочу область у вихідний стан (видалений файл зараз присутній).
Марк

@Marc Це може працювати, але лише у тому випадку, якщо в каталозі немає видимого файлу, оскільки в іншому випадку ./*буде розширено bash, щоб відповідати цим файлам, перш ніж відправляти в git.
Жан Пол

0

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


-1

У мене була така ж проблема, і жодна з відповідей тут не намагалася працювати і для мене. Я використовую Intellij, і я перевірив нову гілку, git checkout -b minimalExampleщоб створити "мінімальний приклад" на новій гілці якогось випуску, видаливши купу файлів та змінивши купу інших у проекті. На жаль, незважаючи на те, що я не вніс жодної зміни в новій гілці "мінімальний приклад", коли я знову перевірив свою "оригінальну" гілку, всі зміни та видалення з гілки "мінімальний приклад" відбулися в " оригінальна "гілка теж (або так вона з'явилася). За git statusвидаленими файлами просто пішли з обох гілок.

На щастя, незважаючи на те, що Intellij попередив мене, що "видалення цих файлів не може бути повністю відновленим", я зміг відновити їх (на мінімальному прикладі гілки, з якої вони були фактично видалені), клацнувши правою кнопкою миші на проект та вибравши Local History > Показати історію (а потім відновити останній елемент історії, який я хотів). Після того, як Intellij відновив файли у гілці "мінімальний приклад", я перемістив гілку до початкового. Потім я переключився на свою "оригінальну" місцеву гілку і побіг git pull origin minimalExampleповернути їх у "оригінальну" гілку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.