2014-07-23 12 views
6

Przypadkowo usunąłem cały katalog mojego kodu źródłowego ... z miłym rm -r. Wiem, naprawdę źle; ale na szczęście miałem repozytorium git w katalogu zawierającym. W związku z tym git ma ogromną listę zmian usuniętych plików niezaprogramowanych. Na przykład:Przywróć skasowany plik nie wystawiony w git

"deleted: src/caronmonitor/server.py" 

Jak mogę odzyskać te pliki? Jest rada całej sieci zrobić:

git checkout file 

lub

git revert <commit> 

Ale jak rozumiem, że będzie przywrócić plik do jego stanu na ostatni popełnić. Nie chcę wracać do ostatniego zatwierdzenia, ale zamiast tego wracam na prawo przed operacją usuwania. Mogę zaglądać do gitk i widzieć moje pliki tak jak przed usunięciem; to musi być możliwe.

+0

Czy wystawiłeś plik przed usunięciem? W przeciwnym razie git diff pokaże ci tylko stan ostatniego zatwierdzenia. – knittl

+0

Nie były one wystawiane. Zepsułem się, mam na myśli gitka. Więc co znajduje się w gitku w sekcji "Lokalne niezatwierdzone zmiany, niezaznaczone do indeksu" to, co jest na ostatnim zatwierdzeniu? –

Odpowiedz

3

Nie, GIT nie robi żadnego magicznego. Jeśli nie wystawiłeś lub nie dokonałeś zmian, to te zniknęły. Możesz zobaczyć skreślenia, ale możesz przywrócić te ostatnie do stanu, w którym powiedziałeś GIT, aby zapamiętał je dla ciebie.

Musisz wyraźnie powiedzieć GIT, aby pamiętać o swoich zmianach, wykonując pomiary i zatwierdzając.

Więc jeśli plik.txt w repozytorium treści:

int main(argc[] args){ 
     System.out.println("example"); 
    } 

To była twoja ostatnia zmiana, która została przyznaniem lub wystawił.

Teraz edytować plik.txt zawierać coś takiego:

int main(argc[] args){ 
System.out.println("example"); 
System.out.println("Hey I can print more lines"); 
} 

zapisać plik, zamknij edytor, nic nie robić z git i zrobić rm -r Teraz plik istnieje, i git ma odniesienie do pliku i że został usunięty, ale zawartość tego pliku w git jest jedynie:

int main(argc[] args){ 
     System.out.println("example"); 
    } 
+0

Rozumiem, że git nie robi żadnej magii; ale wydaje się, że w gitk git ma kopię plików przed tym usunięciem. Przypadkowo usunąłem pojedynczy plik z repozytorium git raz i byłem w stanie go przywrócić, przynajmniej, myślałem, że zrobiłem. –

+0

@ Vance-Turner Dodałem mały przykład, aby zilustrować, jak to widzę. – Mateusz

+0

Ach, rozumiem; Dziękuję Ci bardzo. –

8

Tak, zrobić git checkout filename

Jeśli masz wiele plików, a chcesz przywrócić wszystkie z nich z powrotem, należy git checkout . z korzenia katalogu git.

Zamówienie spowoduje przywrócenie plików do ostatniej wersji, która została dodana/zatwierdzona; jeśli plik nie został jeszcze dodany lub zatwierdzony, zostanie utracony.

Tak więc, na przykład:

$ git init && touch test1.txt test2.txt test3.txt 
$ git add test1.txt && git commit -m "test1" && git add test2.txt 
$ ls -a 
. .. .git test1.txt test2.txt test3.txt 

#deleting files below, 2 will be recovered, 3rd will be gone. 
$ rm * 
$ ls -a 
. .. .git 

$ git checkout . 
$ ls -a 
. .. .git test1.txt test2.txt 
#test3.txt is gone, test2.txt was recovered, even though not committed but just added 
0

git nie zapisano żadnych zmian, które nigdy nie zostały dodane lub popełnione. Najlepsze, co możesz zrobić, to zgarnąć polecenie kasowania usuniętego katalogu, a odzyskasz go w takim stanie, w jakim był ostatnio popełniony.

git checkout <branch_you_are_in> <directory_of_all_your_source_code>

Lokalne zmiany niewyasygnowane widzisz to prawdopodobnie uncommitted usunięcie, to znaczygit widzi, że usunąłeś gromadę plików, ale nie popełniłeś tego, że zostały one usunięte, więc git mówi: "hej, są pewne zmiany (w tym przypadku, skreślenia), których nie popełniłeś."