Восстановить удаленную папку в репозитории Git


101

Я удалил все содержимое папки, и папка пуста. У меня все еще была копия в моем удаленном репо. Но когда я сделал это, git pullон не вернул удаленные файлы, не должно ли этого делать?

Итак, я провел небольшое исследование и увидел, что вы можете вернуть файл, выполнив git checkout <revision> -- <name of file>

Но это работает только с файлами.

Как я могу получить все файлы внутри каталога?


1
git statusподскажет, какие команды нужно запускать
Тавиан Барнс

1
Похоже, у вас все еще есть старый каталог в вашем удаленном репо (и, возможно, он даже есть в вашем локальном репо). НАДЕЖНОЕ ПРЕДЛОЖЕНИЕ: 1) Сделайте «вытягивание» из вашего удаленного репо в НОВОЕ репо (не причиняйте больше вреда вашему локальному репо). 2) Попробуйте "оформить заказ" ... или даже "вернуться" в новом локальном репо: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Обновите удаленное репо, если вы уверены, что все в порядке.
paulsm4

Ответы:


256

Все, что вы можете сделать с файлом, вы можете сделать и с папкой.

Также обратите внимание на поиск и восстановление удаленного файла в репозитории Git.


Файлы удаляются из рабочего дерева, но еще не зафиксированы:

Если вы еще не индексировали ( git add) свои изменения, вы можете вернуть содержимое каталога:

git checkout -- path/to/folder

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

git reset -- path/to/folder
git checkout -- path/to/folder


Восстановить полное рабочее дерево (а не отдельную папку), но потерять все незафиксированные изменения

git reset --hard HEAD


Когда файлы удаляются в каком-то коммите в прошлом:

Найдите последнюю фиксацию, которая повлияла на данный путь. Поскольку файла нет в фиксации HEAD, эта фиксация должна была удалить его.

git rev-list -n 1 HEAD -- <file_path>

Затем проверьте версию перед фиксацией, используя ^символ каретки ( ):

git checkout <deleting_commit>^ -- <file_path>


Восстановить полное рабочее дерево из удаленной фиксации

git reset --hard <revision> 

1
git checkout -- path/to/folder/* не работает Примечание: вопрос в том, как восстановить папку, а не файл
gman 06

@gman How can I retrieve all the files inside the directoryозначает как каталог, так и его файлы. Но и у меня эта команда на удивление не работает. Помню, год назад это было.
Ник Волынкин

2
@gman но работает как git checkout -- pathили git checkout -- 'path/*'. В вашем примере вы удаляете то, с git rmчем OP, похоже, не работает. Я добавил инструкцию для такого случая. Благодарность!
Николай Волынкин

3
В Windows вы должны поставить кавычки как это:git checkout "<deleting_commit>^" -- <file_path>
Maor

Он отключил кучу вещей во всем репо, хотя я указал папку в команде сброса. Какой в ​​этом смысл? Когда я запустил оформление заказа, похоже, что моя папка восстановлена. Я понятия не имею, что unstage сделал с остальной частью моего кода, ах, радости однорангового менеджера репозитория, используемого для централизованных репозиториев, вздох.
Пол Кенджора

5

Если вы еще не зафиксировали свои изменения, вы можете вернуть содержимое или каталог:

git checkout -- removed_directory

Если вы хотите отменить все изменения, сделайте:

git reset --hard HEAD

3
git checkout -- removed_directory не работает
gman 06

git checkout -- removed_directoryработал у меня, но я создавал этот каталог раньше ( checkoutодним из файлов в этом каталоге). После создания все файлы были восстановлены в папке этой командой.
Boolean_Type

5

Вы можете восстановить файлы или папку с помощью git restore.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Здесь master ~ 1 возвращает вашу папку в ревизию "1" из вашей основной ветки.

Источник: https://git-scm.com/docs/git-restore


4

Единственное, что у меня сработало, - это проверить репо в другой папке. Предположим, что текущее репо находится в /home/me/current.

Я тогда сделал

git clone /home/me/current /home/me/temp

Это делает отдельный клон репо в /home/me/temp

Теперь я могу пойти /home/me/tempи делать все, что хочу. Например

git reset --hard commit-hash-before-delete

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

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

И удалите временную папку

rm -rf /home/me/temp

Примеры

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

НЕ РАБОТАЕТ

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

Другие примеры, такие как

git reset --hard HEAD

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

по аналогии

git reset --hard some-commit

потеряет любые коммиты после some-commit


2

Начиная с git 2.24.0, есть экспериментальная новая команда git : git restore

git restore --staged some/deleted/folder

Он показывает мне git: «восстановление» - это не команда git
Ахмед Си,

0

Если вы не укажете конкретный файл, вы сможете извлечь все содержимое конкретной фиксации. Например: git checkout 264794319e9695ba843cd6(при условии, что у хеша все ваши файлы в правильном состоянии).

Причина pullне в восстановлении файлов в том, что git рассматривает ваши удаления как самые свежие изменения, применяя их поверх всего, что вы тянете.

(Я бы порекомендовал поэкспериментировать в новой ветке.)


0

Если вы просто хотите восстановить удаленную папку и у вас есть другие коммиты после удаления, вы также можете просто перейти к своему проекту на github.com.

На github.com перейдите к последней фиксации, в которой есть ваша папка. Вы должны увидеть сообщение о фиксации, а справа есть кнопка с надписью «Обзор файлов». Щелкнув по нему, вы перейдете ко всем файлам с этого этапа фиксации.

Оттуда вы можете клонировать код или просто загрузить его в виде zip-архива.


-1

для незавершенных удалений, это так просто:

git reset HEAD rel / путь / к / удаленному / каталогу / *

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.