Czy mogę przywrócić usunięte pliki (cofnąć `git clean -fdx`)?

119

Postępowałem zgodnie z instrukcjami dotyczącymi tworzenia stron github i zapomniałem przejść do mojego podkatalogu git. W rezultacie właśnie nukowałem cały katalog dokumentów za pomocą git clean -fdx.
Czy jest jakiś sposób, żebym mógł naprawić ten straszny błąd?

Eric
źródło
2
Nie wiem na pewno, ale nie sądzę, że jest to możliwe z git. Jednak narzędzie przywracające usunięcie systemu plików może załatwić sprawę.
static_rtti
9
Co ciekawe, Git Community Book sugeruje również git clean -fdxbez żadnego ostrzeżenia, że ​​operacja jest tak niebezpieczna. Zastanawiam się, ile osób nieodwołalnie zniszczyło swoje pliki tą pozornie niewinną sugestią.
catpnosis
5
Pamiętaj, aby sprawdzić, czy Twoje IDE ma „Historię lokalną”, taką jak Eclipse lub IntelliJ IDE. To może zaoszczędzić wiele bólu serca z powodu nieumyślnych git cleanpołączeń. Spróbuj też wyrwać się z nawyku sprzątania bez sprawdzania. Utwórz skrypt Powershell lub Bash, który można wywołać, który będzie uruchamiany git clean -fdxnz monitem o potwierdzenie, zanim faktycznie uruchomisz niezwykle destrukcyjne czyszczenie.
Josh Burgess

Odpowiedzi:

129

Nie. Te pliki zniknęły.

(Właśnie sprawdzone w systemie Linux: git clean wywołujeunlink() i nie tworzy wcześniej kopii zapasowej).

Mata
źródło
32
Jeśli korzystasz z zaawansowanego środowiska IDE, takiego jak RubyMine, Eclipse itp., Istnieje prawdopodobieństwo, że będzie miał lokalną historię usuniętych plików i możesz je odzyskać.
Usman
1
@Usman w moim przypadku git cleanprzypadkowo usunął zmiany z półki w .ideaukrytym folderze, a historia lokalna mnie uratowała!
emkman
2
Świetna wskazówka od @Usman. Dzięki Eclipse mogłem odzyskać plik za pomocą opcji „Przywróć z historii lokalnej ...”: i.imgur.com/XWNLOk5.gifv
brandizzi
1
Właściwie jest to MOŻLIWE, ale z hacką metodą. Zobacz tę odpowiedź: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow
4
W PyCharm możesz je również przywrócić. Kliknij prawym przyciskiem myszy folder, który je zawiera, kliknij Historia lokalna, znajdź usunięcie i kliknij Przywróć.
Juanjo Conti
48
git clean -fdxn

Wykona próbny przebieg i pokaże, jakie pliki zostałyby usunięte, gdybyś uruchomił

git clean -fdx

(oczywiście jest to pomocne tylko wtedy, gdy wiesz o tym z wyprzedzeniem, ale na następny raz)

Peter Ajtai
źródło
7
Aby to dodać, -ndziała na większości poleceń git (i wielu innych poleceń * nix).
Nick McCurdy
23

IntelliJ / Android Studio umożliwia przywracanie plików z historii lokalnej .

Y2i
źródło
3
PyCharm również to obsługuje! Dziękuję za tę odpowiedź. Tak się cieszę, że przeczytałem pozostałe odpowiedzi po tym, jak pierwsza trójka brzmiała „nie przepraszam, nie masz szczęścia”.
Bryson
18

Nie. "Git clean -fdx" usunie wszystkie pliki i katalogi, których git nie śledzi z twojego katalogu roboczego. Ponieważ Git nie śledzi tych plików, nie będzie miał żadnych kopii zapasowych tych plików. Przynajmniej nie zwykle.

Jeśli wykonałeś „git add” na jednym z tych plików stosunkowo niedawno (ale przerwałeś zatwierdzanie), istnieje szansa, że ​​możesz go znaleźć za pomocą „git fsck --lost-found”. Warto spróbować, ale nie rób zbyt wielkich nadziei.

W przyszłości powinieneś raczej rozważyć popełnienie kilku razy za często niż kilka razy za rzadko. W ten sposób będziesz mieć przynajmniej lokalną kopię zapasową, nawet jeśli nie skończysz wypychać tych zatwierdzeń do pilota.

kusma
źródło
Prawdziwym problemem było to, że katalog nie miał być również repozytorium. Patrząc wstecz na dziennik, okazuje się, że zapomniałem CD do nowego katalogu repozytorium po mkdirjego wykonaniu
Eric
1
Wkrótce po przeczytaniu tego pytania napisałem łatkę do Gita, która dodaje zmienną konfiguracyjną do tworzenia kopii zapasowych każdego usuniętego pliku. Może przyda się innym? github.com/kusma/git/tree/work/clean-backup
kusma
1
Miałem dzisiaj szczęście !!! Dzięki "git fsck --lost-found". Użyłem następującego polecenia, aby uzyskać WSZYSTKIE zmiany: git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log Ponieważ chciałem mieć cały plik, który dodałem, a następnie usunąłem, mogłem go pobrać z dziennika. :)
Marcello de Sales
11

Jak wspomniał @kusma powyżej, jeśli masz szczęście (jeśli kiedykolwiek zrobiłeś "git add"), możesz użyć następującego polecenia, aby wyodrębnić cały obiekt:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

W ten sposób będzie szukał wszystkich typów fragmentów, zbierał całe różnice i dodawał do pliku, w którym można wyodrębnić utracony plik. W moim przypadku straciłem całą klasę Java.

Marcello de Sales
źródło
8

Jeśli używasz dowolnego IDE Jetbrains, istnieje opcja, aby zobaczyć lokalną historię pliku. Jeśli już to zrobiłeś git clean, możesz ponownie utworzyć plik i sprawdzić lokalną historię pliku i przywrócić go z tego miejsca.

Pracował dla mnie dla jednego pliku. W przypadku pełnego katalogu nie mam pojęcia, jak to zrobić.

Rajesh Paul
źródło
Utwórz plik w tej samej lokalizacji o tej samej nazwie. W IDE kliknij prawym przyciskiem myszy i kliknij „Pokaż historię”. Kopiuj, wklej z niego zawartość. Doskonała rada @Rajesh. Dzięki.
głęboki
1
Jestem zbawiony. Dziękuję Ci.
Scott
Nie ma potrzeby kopiowania zawartości pliku, po prostu kliknij plik prawym przyciskiem myszy i kliknij `` przywróć '', aby przywrócić go z powrotem do tej wersji (nawet jeśli go usunąłeś)
n00b
7

Miałem dzisiaj ten problem.

Jak powiedzieli inni, git nie przechowuje plików.

Jedynym sposobem na cofnięcie tego jest użycie narzędzia przywracającego. Użyłem "extundelete" i odzyskałem wszystko, ale twój przebieg / system plików może się różnić.

dougallj
źródło
7

Jeśli pracujesz nad Eclipse, jednym z możliwych rozwiązań jest przywrócenie z lokalnej historii Eclipse.

Abhinav
źródło
2
używam PyCharm, a lokalna historia mnie uratowała
psychok7
1
To samo dotyczy IntelliJ IDEA!
Arthurakay
RubyMine ma również lokalną historię. uratował mnie!
Usman
Wszystkie przeglądarki IntelliJ mają historię lokalną. Na szczęście. Używałem WebStorm i prawie miałem tętniaka, zanim to odkryłem. Minęły 3 dni z 12-godzinnych dni pracy, a ja poważnie rozważałem wypicie butelki mocnego alkoholu przy moim biurku.
Josh Burgess
7

Właściwie tak ! To jest możliwe! Ale bez używania poleceń git.
Potrzebujemy tylko narzędzia do odzyskiwania plików, takiego jak Recuva .
Wystarczy wspomnieć o ścieżce, z której został usunięty, i pozwolić mu odzyskać pliki.

Oto kilka przydatnych uwag dotyczących korzystania z tej aplikacji:

  1. Zdecydowanie zalecamy zaznaczenie tego pola wyboru przed przywróceniem plików (gdy usunięte pliki pojawiają się w oknie odzyskiwania):
    Advanced Mode-> Options-> Actions->Restore folder structure
    Dzięki temu wszystkie pliki zostaną odzyskane, zachowując strukturę folderów, więc będzie to znacznie łatwiejsze po prostu przeciągnij i upuść ten folder do ścieżki, z której został usunięty.
  2. Zainstaluj narzędzie do odzyskiwania na urządzeniu USB (z powodu poniższego ostrzeżenia)
  3. Wspominając, gdzie przywrócić pliki, unikaj wybierania tego samego dysku, z którego pliki zostały usunięte (ponownie z powodu poniższego ostrzeżenia), ponieważ obecnie odzyskany plik może nadpisać inny usunięty plik, który nie został jeszcze odzyskany. Odzyskiwanie plików na dowolny dysk USB jest tam zawsze dobrym rozwiązaniem.

Ostrzeżenie!Gdy tylko utracisz (przypadkowo usuniesz) dowolny plik, staraj się nie dotykać (dodawać / edytować plików) dysku, z którego został usunięty, aby zwiększyć możliwość pomyślnego odzyskania. W przeciwnym razie możesz całkowicie stracić ten plik.

Dlaczego to działa: kiedy usuwasz plik, w rzeczywistości nie jest on usuwany. Jest po prostu oznaczony jako „usunięty”, więc następnym razem, gdy dodasz / zaktualizujesz pliki na tym samym dysku, te stare pliki zostaną nadpisane nowymi. Ale dopóki nie zostaną nadpisane, nadal można je odczytać (i oczywiście odzyskać).

Just Shadow
źródło
1
Dzięki, uratowałeś mi życie. Nie wiem, czy to poprawna odpowiedź, ponieważ nie mogłem odzyskać wszystkiego, ale miałem szczęście, ponieważ dostałem najbardziej krytyczne pliki, których potrzebowałem.
XzaR
2

Zrobiłem z kodem, który miałem dodać do mojego repozytorium i wyczyściłem za pomocą -dfx, mogłem przywrócić pliki.

Próbowałem użyć debugfs, look i link z i-węzłów, testdisk i wielu innych narzędzi, które się pojawiają, ale żadne nie znalazło katalogu, który ten głupi pisarz usunął przez przypadek.

Pobierz extundelete z sourceforge.
Prawdopodobnie będziesz musiał zainstalować pakiet e2fslibs-dev
Run

$ ./configure 
$ make 

Wygeneruje plik binarny dla extundelete w folderze src W moim przypadku błędnie usunąłem folder. nazwijmy to FOOBAR

Właśnie pobiegłem:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


i utworzył folder o nazwie RESTORED_FOLDERS

motbus
źródło
Łał! chociaż nie udało się odzyskać żądanego pliku, jest to coś, co zanotuję - na pewno się przyda!
vyom
1

Jeśli używasz komputera Mac i utworzono kopię zapasową za pomocą pliku Time Machine, możesz przywrócić

Nullable
źródło
0

Na szczęście popełniłem ten błąd podczas korzystania z Windows 7. Poszedłem do kosza, podświetliłem wszystkie usunięte pliki i kliknąłem „Przywróć”. Gotowe.

Matt Cashatt
źródło
6
Co masz na myśli? git cleannie przenosi plików do kosza.
MEMark
0

Jeśli nie wypchnąłeś swoich zmian (git push), możesz również przywrócić informacje z serwera, które nie zostały jeszcze zaktualizowane. Użyłem filezilla, aby przywrócić pliki, które usunąłem, i skopiowałem je do moich plików lokalnych. Nie jest to najlepszy sposób, ale działa i unika używania konsoli

Mbotet
źródło