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


100

Я видалив весь вміст у папці, і папка порожня. Я все ще мав копію у своєму віддаленому репо. Але коли я git pullце зробив, він не повернув видалені файли, чи не повинен це робити?

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

Але це працює лише з файлами.

Як я можу отримати всі файли всередині каталогу?


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

1
Схоже, у вас все ще є старий каталог у віддаленому репо (і, можливо, він також є у вашому локальному репо). СИЛА ПРОПОЗИЦІЯ: 1) Зробіть «тягу» з віддаленого репо в нове репо (не завдайте більше шкоди вашому місцевому репо). 2) Спробуйте "замовити" ... або навіть "повернути" у своєму новому, локальному репо: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Оновіть віддалене репо, коли переконаєтесь, що все в порядку.
paulsm4,

Відповіді:


254

Все, що ви можете зробити з файлом, ви можете зробити і з папкою.

Також зверніть увагу Знайдіть і відновіть видалений файл у сховищі 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>

Потім перевірте версію в коміті раніше, використовуючи символ caret ( ^):

git checkout <deleting_commit>^ -- <file_path>


Відновіть повне робоче дерево з віддаленого коміту

git reset --hard <revision> 

1
git checkout -- path/to/folder/* не працює Примітка: питання полягає в тому, як відновити папку, а не файл
gman

@gman How can I retrieve all the files inside the directoryозначає як каталог, так і його файли. Але команда здивовано не працює і для мене. Я пам’ятаю, це було рік тому.
Нік Волинкін

2
@gman, але це працює як git checkout -- pathабо git checkout -- 'path/*'. У вашому прикладі ви видаляєте те, з git rmчим операційна програма, здавалося, не робила. Я додав інструкції для такого випадку. Дякую!
Нік Волинкін

3
У Windows потрібно розміщувати такі лапки:git checkout "<deleting_commit>^" -- <file_path>
Maor

Це видалило купу речей у всьому репо, хоча я вказав папку в команді скидання. Як це має сенс? Коли я запустив замовлення, схоже, він відновив мою папку. Я не уявляю, що нестабільність зробила з рештою мого коду, ах, радості однорангового менеджера сховища, який використовується для централізованих репо, зітхання.
Paul Kenjora

5

Якщо ви ще не ввели свої зміни, ви можете повернути вміст або каталог:

git checkout -- removed_directory

Якщо ви хочете скасувати всі зміни, виконайте:

git reset --hard HEAD

3
git checkout -- removed_directory не працює
gman

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

5

Ви можете відновити файли або папки за допомогою git restore.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Тут master ~ 1 повертає вашу папку до версії "1" назад із вашої гілки master.

Джерело: 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 / path / to / deleted / directory / *

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