Przywróć usunięty folder w repozytorium Git

101

Usunąłem całą zawartość folderu, a folder jest pusty. Wciąż miałem kopię w moim zdalnym repozytorium. Ale kiedy zrobiłem, git pullto nie odłożyłem usuniętych plików, czy nie ma tego zrobić?

Zrobiłem więc trochę badań i zobaczyłem, że możesz przywrócić plik, wykonując git checkout <revision> -- <name of file>

Ale to działa tylko w przypadku plików.

Jak mogę odzyskać wszystkie pliki w katalogu?

json2021
źródło
1
git statuspodpowie, jakie polecenie (a) uruchomić
Tavian Barnes
1
Wygląda na to, że nadal masz stary katalog w swoim zdalnym repozytorium (a może nawet masz go w lokalnym repozytorium). MOCNA SUGESTIA: 1) Wykonaj „przeciągnij” ze zdalnego repozytorium do NOWEGO repozytorium (nie rób już więcej szkód w lokalnym repozytorium). 2) Wypróbuj opcję „do kasy” ... lub nawet „cofnij” w swoim nowym lokalnym repozytorium: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Zaktualizuj repozytorium zdalne, gdy masz pewność, że wszystko jest w porządku.
paulsm4

Odpowiedzi:

255

Wszystko, co możesz zrobić z plikiem, możesz też zrobić z folderem.

Uwaga: Znajdź i przywróć usunięty plik w repozytorium Git


Pliki są usuwane z drzewa roboczego, ale nie zostały jeszcze zatwierdzone:

Jeśli jeszcze nie zindeksowałeś ( git add) swoich zmian, możesz cofnąć zawartość katalogu:

git checkout -- path/to/folder

Jeśli usunięcie jest już zindeksowane, najpierw zresetuj to:

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


Przywróć pełne drzewo robocze (nie pojedynczy folder), ale utracisz wszystkie niezatwierdzone zmiany

git reset --hard HEAD


Kiedy pliki są usuwane w niektórych zatwierdzeniach w przeszłości:

Znajdź ostatnie zatwierdzenie, które wpłynęło na podaną ścieżkę. Ponieważ pliku nie ma w zatwierdzeniu HEAD, to zatwierdzenie musiało go usunąć.

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

Następnie sprawdź wersję przed zatwierdzeniem, używając ^symbolu karetki ( ):

git checkout <deleting_commit>^ -- <file_path>


Przywróć pełne drzewo robocze z odległego zatwierdzenia

git reset --hard <revision> 
Nick Volynkin
źródło
1
git checkout -- path/to/folder/* nie działa Uwaga: pytanie brzmi, jak przywrócić folder, a nie plik
gman
@gman How can I retrieve all the files inside the directoryoznacza zarówno katalog, jak i jego pliki. Ale polecenie, co zaskakujące, też nie działa dla mnie. Pamiętam, że zrobiłem to rok temu.
Nick Volynkin
2
@gman, ale działa jak git checkout -- pathlub git checkout -- 'path/*'. W twoim przykładzie usuwasz, z git rmktórym OP nie wydawał się działać. Dodałem instrukcje dla takiego przypadku. Dzięki!
Nick Volynkin
3
W systemie Windows musisz umieścić takie cytaty:git checkout "<deleting_commit>^" -- <file_path>
Maor
Rozstrzelił kilka rzeczy w całym repozytorium, mimo że określiłem folder w poleceniu resetowania. Jak to ma sens? Kiedy uruchomiłem kasę, wygląda na to, że przywrócił mój folder. Nie mam pojęcia, co zrobił Unstage z resztą mojego kodu, ach, radość z menedżera repozytorium peer to peer używanego do scentralizowanych repozytoriów, westchnij.
Paul Kenjora
5

Jeśli jeszcze nie zatwierdziłeś zmian, możesz przywrócić zawartość lub katalog:

git checkout -- removed_directory

Jeśli chcesz cofnąć wszystkie zmiany, wykonaj:

git reset --hard HEAD
Ivan Mushketyk
źródło
3
git checkout -- removed_directory nie działa
gman
git checkout -- removed_directorypracował dla mnie, ale utworzyłem ten katalog wcześniej (przez checkoutjeden z plików w tym katalogu). Po utworzeniu wszystkie pliki zostały przywrócone w folderze za pomocą tego polecenia.
Boolean_Type
5

Możesz przywrócić pliki lub folder za pomocą git restore.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Tutaj, mistrzu ~ 1 przywraca folder do wersji „1” z powrotem z gałęzi master.

Źródło: https://git-scm.com/docs/git-restore

jBelanger
źródło
4

Jedyną rzeczą, która działała dla mnie, było pobranie repozytorium w innym folderze. Załóżmy, że bieżące repozytorium jest dostępne /home/me/current.

Wtedy zrobiłem

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

To tworzy osobny klon repozytorium w /home/me/temp

Teraz mogę iść /home/me/tempi robić, co chcę. Na przykład

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

Teraz mogę z powrotem skopiować usunięty folder plików

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

I usuń folder tymczasowy

rm -rf /home/me/temp

Przykłady

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

NIE DZIAŁA

$ 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.

Inne przykłady, takie jak

git reset --hard HEAD

są destrukcyjne poza tylko usuniętymi plikami. Wszelkie inne zmiany również zostaną utracone.

podobnie

git reset --hard some-commit

straci wszystkie zatwierdzenia po some-commit

gman
źródło
2

Począwszy od git 2.24.0, jest nowe eksperymentalne polecenie git : git restore

git restore --staged some/deleted/folder
iethree
źródło
Pokazuje mi git: „restore” nie jest poleceniem git
Ahmed C
0

Jeśli nie określisz konkretnego pliku, powinieneś być w stanie pobrać pełną zawartość określonego zatwierdzenia. Na przykład: git checkout 264794319e9695ba843cd6(zakładając, że hash ma wszystkie twoje pliki we właściwym stanie).

Powodem pullnie jest przywracanie plików, ponieważ git postrzega twoje usunięcia jako nowszą zmianę, stosując ją do wszystkiego, co pobierasz.

(Polecam eksperymentowanie w nowej gałęzi).

Lostphilosopher
źródło
0

Jeśli chcesz tylko odzyskać usunięty folder i po usunięciu masz inne zatwierdzenia, możesz również po prostu przejść do swojego projektu na github.com.

Z github.com przejdź do ostatniego zatwierdzenia, w którym znajduje się twój folder. Powinieneś zobaczyć komunikat o zatwierdzeniu, a po prawej stronie znajduje się przycisk oznaczony „Przeglądaj pliki”. Kliknięcie tego przeniesie Cię do wszystkich plików z tego etapu zatwierdzenia.

Stamtąd możesz sklonować kod lub po prostu pobrać kod jako plik ZIP.

stldoug
źródło
-1

w przypadku niezamierzonych usunięć jest tak proste, jak to:

git reset HEAD rel / ścieżka / do / usunięty / katalog / *

justadev
źródło