2012-02-28 27 views
54

Zrobiłem coś bardzo głupiego. Zrobiłem commit za pomocą git commit (edycja plików + nowe pliki) (C). Potem poprawiłem ostatnie zatwierdzenie. Następnie usunąłem wszystkie pliki rekursywnie (!) Przy użyciu git rm -r Następnie zrobiłem kolejne zatwierdzenie git (C).Cofnij usunięcie w GIT

 
A-B-C 
    ↑ 
    master 

Czy istnieje sposób na przywrócenie plików, ale zachować zmiany, które miałem w moim pierwszym zatwierdzeniu? (C) Wolałbym nie wracać do (B). Próbowałem git zresetować --soft głowy ^, więc wtedy git status listy plików, które usunąłem, potem zrobiłem git checkout, ale wciąż nie ma szczęścia. Nie wiem nawet, czy to możliwe.

+0

, więc chcesz pliki z zatwierdzeniem A z powrotem? – uday

+1

Nie, chcę nadal być w C, ale bez plików usuniętych, tylko moje zmiany plików i plików dodaje. Obecnie nie mam plików w moim drzewie roboczym, są one usuwane. – Nately

Odpowiedz

158

Zrób sobie przysługę i nie rób tego, jak sugeruje inna odpowiedź i napotkasz więcej problemów.

Jeśli usunięto plik z katalogu roboczego i nie popełnił jeszcze zmiany, wykonaj następujące czynności:

git checkout -f 

UWAGA: popełnić plików niezatwierdzone przed wykonaniem tego polecenia, w przeciwnym razie stracimy je wszystkie

Usunięte pliki powinny zostać z powrotem.

Jeśli nie i jeśli możesz znaleźć zatwierdzenie, które chcesz (C, itd. - twoje pytanie nie jest jasne) z git reflog, po prostu wykonaj git reset --hard <hash from reflog> i powinieneś już wszystko ustawić.

+3

+1 Możesz dodać link do oddzielnego pytania głównego (np. Http://stackoverflow.com/questions/3965676/why-did-git-detach-my-head/3965714#3965714), aby zilustrować problem z git checkout Odpowiedź SHA1. Czy ORIG_HEAd pomógłby w tym przypadku? (http://stackoverflow.com/questions/964876/head-and-orig-head-in-git/964927#964927) – VonC

+1

OK, więc ta odpowiedź jest w rzeczywistości lepsza. reset - ostro do zostawia mnie na moim głównym oddziale, a ja nie zostanę w stanie "odłączonego HEAD". Odpowiedź Sashy była również dobra w przypadku odzyskiwania utraconych danych. – Nately

+2

Dziękuję za uratowanie mojego tyłka właśnie teraz. – Seth

5

Jeśli zrozumiałem cię poprawnie, przepisałeś ponownie zatwierdzenie C. Więc oryginalny commit, nazwijmy go C1, nie jest dostępny z twojego wykresu commit, ale wciąż tam jest (git zachowuje wszystkie zatwierdzenia przez jakiś czas). Użyj wartości git reflog, aby uzyskać wartość skrótu zatwierdzenia i git checkout <hash> lub inne odpowiednie polecenie, aby przejść do starego stanu C1.

+0

Mój Boże! Dziękuję bardzo, bardzo! Zatwierdzenie tam było. Uratowałeś mi trzy tygodnie pracy (od ostatniego zatwierdzenia;)). DZIĘKUJĘ CI! – Nately

+0

Jeszcze jedno pytanie. Teraz mówi, że jestem w stanie "odłączonego HEAD". Jak mogę wrócić do mojego oddziału "master"? – Nately

+0

Nie ma za co. Jednak nie rozumiem głosowania w dół. Reset git --hard jest potencjalnie bardziej niebezpieczny. Nie było jasne, czy plakat zmienił pierwotny commit C ze zmianami, które chciał zachować. – Sascha