git odzyskuje usunięty plik, w którym nie wykonano żadnego zatwierdzenia po usunięciu

812

Usunąłem niektóre pliki.

NIE zobowiązałem się jeszcze.

Chcę zresetować mój obszar roboczy, aby odzyskać pliki.

Zrobiłem git checkout ..

Ale usuniętych plików nadal brakuje.

I git statuspokazuje:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

Dlaczego nie git checkout .resetuje się obszaru roboczego HEAD?

Homan
źródło
16
gdybyś nie wprowadził zmian po usunięciu, git checkout .działałoby dobrze.
faizal
10
@faizal, a jeśli to zrobisz, stracisz zmiany.
Vasiliy Yorkin,
1
Wystarczy nacisnąć Ctrl-J w git gui na usuniętym elemencie.
ajeh
git checkout - cc.properties store / README store / cc.properties
Vinod Pasi
Zobacz odpowiedź: quora.com/…
live-love

Odpowiedzi:

787

Dane wyjściowe podpowiadają, co należy zrobić. git reset HEAD cc.propertiesitp.

Spowoduje to wycofanie operacji rm. Następnie ponowne uruchomienie git statuspowie ci, że musisz zrobić a, git checkout -- cc.propertiesaby odzyskać plik.

Aktualizacja: Mam to w swoim pliku konfiguracyjnym

$ git config alias.unstage
reset HEAD

którego zwykle używam do inscenizacji.

Noufal Ibrahim
źródło
5
Jak to zrobić dla wielu usuniętych plików? Wielokrotne uruchomienie git reset HEAD <<nazwa_pliku>> byłoby kłopotliwe, czy jest jakiś skuteczny sposób, aby to zrobić?
SubSul
70
git reset HEAD \*a następniegit checkout -- .
Noufal Ibrahim
3
ale zmodyfikowałem pliki.
Jiang YD,
@RauliRajande Prawdopodobnie Twoja sytuacja różni się od opisanej w pierwotnym pytaniu.
Noufal Ibrahim
1
rm -r ./engines- ups. Teraz git reset engines; git checkout engines.
Kris,
209

Zainscenizowałeś usuwanie, więc musisz zrobić:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . pobiera tylko z indeksu, w którym usunięcie zostało już ustawione.

CB Bailey
źródło
177

Po prostu zrób git checkout path/to/file-I-want-to-bring-back.txt

seddonym
źródło
8
działa tylko wtedy, gdy pliki nie zostały zatwierdzone i przekazane.
mahen3d
23
Nie działało dla mnie, git powiedział, że nie zna żadnego pliku o tej nazwie, chociaż plik jest śledzony. Też nie popełniłem, tylko pomyłkowo usunąłem plik używając menu kontekstowego netbeans.
Zelphir Kaltstahl
4
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov
@ user3479125 Chyba twój plik nigdy nie został zatwierdzony. Co git statuso tym mówi?
ki92
12
Status Git pokazał, że zielony „delated file.ext” git checkout HEAD -- file.extpomógł go przywrócić.
Ivan Borshchov
143

Aby automatycznie odzyskać wszystkie nieetapowe usunięcia jednocześnie, bez określania poszczególnych ścieżek:

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

Aby automatycznie odzyskać wszystkie etapowe usunięcia jednocześnie, bez określania poszczególnych ścieżek:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
PaoloC
źródło
12
Przypadkowo usunąłem ponad 500 plików i to działało, ponieważ zachowało to również wszystkie moje ważne zmiany (pierwszy wiersz jest tym, którego użyłem). Dzięki.
Guy Lowe
1
Przypadkowo usunięto całą zawartość repozytorium zaraz po udanej kompilacji. Pierwsze polecenie uratowało mi bekon.
MonaLisaOverdrive
2
Zanim to zadziała, musiałem biec git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn
1
Bardzo przydatne, chciałem zachować nieśledzone pliki, ale pozbyć się usuniętych i zmodyfikowanych, właśnie zmieniłem -d na -m do obsługi zmodyfikowanych.
RaisinBranCrunch
5
Zauważ, że to nie działa, jeśli masz spacje w nazwach / ścieżkach plików. Myślę, że git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --zadziała.
parsley72,
79

Ponieważ wykonujesz polecenie git checkout ., wygląda na to, że próbujesz przywrócić gałąź do ostatniego stanu zatwierdzenia.

Możesz to osiągnąć za pomocą git reset HEAD --hard

Ostrzeżenie

Może to spowodować usunięcie wszystkich najnowszych modyfikacji i wycofanie modyfikacji, np. Możesz stracić pracę. Może to być to, czego chcesz, ale sprawdź dokumenty, aby się upewnić.

Paul T.
źródło
39
Łał !! Ostrożnie z tym !!!! Być może masz rację, ale ktoś może być zdezorientowany i wysadzić cały swój kod. Byłoby fajnie, gdybyś dodał większe ostrzeżenie.
Santiagobasulto
3
Właśnie tego potrzebowałem. Nie wysadza całego kodu - po prostu przywraca cię do ostatniego zatwierdzenia.
Andrew Hendrie,
2
W pewnym momencie skończyły mi się setki brakujących plików. Jest to jedyny praktyczny sposób rozwiązania problemu. Dzięki!
Jonathan Benn
66

jeśli użyłeś

git rm filename

następnie usunąć plik

git checkout path/to/filename

nie działa, więc w takim przypadku

git checkout HEAD^ path/to/filename

powinno działać

Aurangzeb
źródło
2
Podoba mi się ta odpowiedź. Nie ma wątpliwości, że wpływasz tylko na określony plik, który usunąłeś. 1) git checkout path / to / filename 2) git checkout - path / to / filename
Ed of the Mountain
Świetny. git checkout HEAD^ path/to/filenamepracował dla mnie, ponieważ nie popełniłem pliku.
Mojżesz Ndeda
29

Oto polecenie, które pomogło mi na moim komputerze Mac. Wypróbowałem kilka innych rozwiązań, ale one nie działały dla mnie.

Wersja Git na OSX Mavericks

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

Komenda

git checkout HEAD -- path/to/file/file.cc
Chris Hinshaw
źródło
19
git checkout HEAD -- client/src/pp_web/index.cljs
Dustin Getz
źródło
18

Służy git ls-filesdo kasowania usuniętych (-d) lub zmodyfikowanych (-m) plików.

git checkout $(git ls-files -d)

zobacz Jak mogę przywrócić tylko zmodyfikowane pliki w kasie git?

rickfoosusa
źródło
znacznie lepsze i prostsze niż inne rozwiązania
joshi123
1
Jeśli niektóre pliki mają miejsce, możesz to zrobić git ls-files -d | xargs -I{} git checkout "{}".
Jean Paul
17

Jeśli chcesz przywrócić wszystkie pliki jednocześnie

Pamiętaj, aby użyć kropki, ponieważ każe git pobrać wszystkie pliki.

To polecenie zresetuje głowicę i cofnie wszystkie zmiany:

$ git reset HEAD . 

Następnie uruchom to, aby przywrócić wszystkie pliki:

$ git checkout .

Następnie robiąc status git, otrzymasz:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Casper Wilkes
źródło
Jest to trochę najprostsze rozwiązanie i działa na kilka plików (powiedzmy, że usunąłeś wiele plików / folderów). dobra robota koleś +
Gkiokan
9

Czy chcesz to zobaczyć?

dotyczy to przypadków, w których korzystałeś

git checkout -- .

zanim coś popełnisz.

Możesz także pozbyć się utworzonych plików, które nie zostały jeszcze utworzone. I nie chcesz ich. Z :

git reset -- .
Paulo Linhares - Packapps
źródło
Nie zgłosiłeś w pełni skopiowanej odpowiedzi. W rzeczywistości git checkout -- .nie pomaga odzyskać skasowane pliki i odpowiada co pytający próbowałem: git checkout .. Część których praca może jest jeden, że nie kopiować: git checkout <file_path>.
Jean Paul,
6

Znalazłem ten post, szukając odpowiedzi, jak usunąć plik, który został usunięty z mojego katalogu roboczego po scaleniu z gałęzią innej osoby. Po fuzji nie dokonano jeszcze zatwierdzenia. Ponieważ trwało scalanie, nie mogłem po prostu dodać go ponownie, używając:

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

Musiałem zrobić kolejny krok oprócz resetowania, aby przywrócić plik:

$ git checkout -- file.cpp
użytkownik2453404
źródło
4

Jeśli nie wprowadziłeś żadnych zmian, wszystko, co musisz zrobić, to ukryć te zmiany i powrócisz do ostatniego działającego zatwierdzenia.

git stash
git stash clear
git clean 
Stóg
źródło
Umieszczenie go na stosie skrytki nie jest rozwiązaniem. To jest hack.
Robert Dolca
2
To dobre rozwiązanie, ponieważ możesz je usunąć ze schowka. Jeśli to hack czy nie, to kwestia gustu. Cała idea skrytki to sprytny hack.
Eino Mäkitalo,
@ EinoMäkitalo cieszę się, że może ci pomóc :)
Rick,
Najbardziej podoba mi się to podejście ze wszystkich wymienionych
ckapilla
3

jeśli szukasz skasowanego katalogu.

 git checkout ./pathToDir/*
PPB
źródło
3

Oto różne przypadki jako odniesienie, aby pomóc innym:

Jeśli usunięcie nie zostało zatwierdzone, poniższe polecenie przywróci usunięty plik z drzewa roboczego.

$ git checkout -- <file>

Możesz uzyskać listę wszystkich usuniętych plików z drzewa roboczego, używając poniższego polecenia.

$ git ls-files --deleted

Jeśli usunięcie zostało zatwierdzone, znajdź zatwierdzenie w miejscu, w którym się ono wydarzyło, a następnie odzyskaj plik z tego zatwierdzenia.

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

Powinno dać ci coś w rodzaju c46e81aa403ecb8a0f7a323a358068345: Teraz użyj zatwierdzenia # tutaj

$ git checkout <commit>^ -- <file>

Coś w tym stylu: $ git Checkout c46e81aa403ecb8a0f7a323a358068345 -

Jeśli szukasz ścieżki pliku do odzyskania, poniższe polecenie wyświetli podsumowanie wszystkich usuniętych plików.

$ git log --diff-filter=D --summary

Jeśli chcesz tylko wyświetlić listę plików:

git log --diff-filter=D --summary | grep "delete mode"
Muhammad Soliman
źródło
2

Dla mnie to, co zadziałało, było git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Na przykład git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(wykonywany w gałęzi, w której chcemy przejść do pliku)

Po wykonaniu tego polecenia przywrócony plik będzie istniał w oryginalnej lokalizacji (którą trzeba będzie zatwierdzić)

Dinis Cruz
źródło
i / lub po prostu git checkout master path/to/the/file.bintak, aby po prostu cofnąć usunięcie tego pliku bez utraty innych dokonanych zmian. PS: to powinna być zaakceptowana odpowiedź ...
Edoardo,
1

Jeśli zainstalowałeś ToroiseGIT, po prostu wybierz pozycję menu „Przywróć ...” dla menu podręcznego folderu nadrzędnego.

Wasyl Shyrochuk
źródło
1

1. Znajdź to konkretne zobowiązanie, do którego chcesz przywrócić, używając:

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

2. Odwołaj się do tego zatwierdzenia, używając:

    git revert <commit id> 

Teraz Twój oddział lokalny będzie miał wszystkie pliki w szczególności

Ashutosh S.
źródło
Działa to, jeśli już zatwierdziłeś swoje zmiany.
live-love
1

UWAGA: najpierw poproś o pracę, którą chcesz zachować.

Możesz zresetować swój obszar roboczy (i odzyskać usunięte pliki)

git checkout ./*
Henrique Florêncio
źródło
2
FYI ... to polecenie usunęło wszystkie moje działające pliki i nie odzyskało usuniętego pliku
..
Dlatego używasz tego polecenia, aby RESETOWAĆ swój obszar roboczy. Pomyślałem, że to samo wyjaśnia.
Henrique Florêncio
1
To polecenie nie działa, ponieważ jeśli plik zostanie usunięty, nie zostanie przechwycony ./*.
Jean Paul,
@JeanPaul, być może jestem nieporozumieniem, ale ustawiłem mój obszar roboczy w oryginalnym stanie (teraz usunięty plik).
Marc
@Marc Może działać, ale tylko wtedy, gdy w katalogu nie ma widocznego pliku, ponieważ w przeciwnym razie ./*zostanie rozszerzony przez bash, aby dopasować te pliki przed wysłaniem do git.
Jean Paul
0

Miałem ten sam problem, jednak żadne z powyższych rozwiązań nie zadziałało. Skończyło się to na:
- utworzeniu pustego pliku o tej samej nazwie
- porównaniu tego pliku z jego lokalną historią
- skopiowaniu historii do pustego pliku.

TheEUG
źródło
-1

Miałem ten sam problem i żadna z odpowiedzi, które tu wypróbowałem, również nie działała dla mnie. Korzystam z Intellij i sprawdziłem nowy oddział, git checkout -b minimalExampleaby stworzyć „minimalny przykład” dla nowej gałęzi jakiegoś problemu, usuwając kilka plików i modyfikując kilka innych w projekcie. Niestety, mimo że nie dokonałem żadnych zmian w nowej gałęzi „minimalnego przykładu”, kiedy ponownie sprawdziłem moją „oryginalną” gałąź, wszystkie zmiany i usunięcia z gałęzi „minimalnego przykładu” miały miejsce w gałęzi „ też oryginalna gałąź (a przynajmniej tak się wydawało). Według git statususuniętych plików właśnie zniknęły z obu gałęzi.

Na szczęście, mimo że Intellij ostrzegł mnie, że „usunięcie tych plików może nie być w pełni możliwe do odzyskania”, udało mi się je przywrócić (w minimalnej przykładowej gałęzi, z której zostały faktycznie usunięte), klikając projekt prawym przyciskiem myszy i wybierając Historia lokalna > Pokaż historię (a następnie Przywróć najnowszy element historii, który chciałem). Po przywróceniu plików przez Intellij w gałęzi „minimalnego przykładu” przesunąłem gałąź do źródła. Potem wróciłem do mojego „oryginalnego” oddziału lokalnego i pobiegłem, git pull origin minimalExampleaby odzyskać je również w „oryginalnym” oddziale.

genSummons
źródło