Cofnij do ostatniego zatwierdzenia git

120

Właśnie zrobiłem

git commit -m "blah"

następnie dodałem kilka plików, jak mogę przywrócić i usunąć to, co jest w moich bieżących plikach, które nie zostały jeszcze dodane / zatwierdzone?

Blankman
źródło
15
nie, nie o to prosi OP - jasne jest, że chce cofnąć się do ostatniego zatwierdzenia, a nie cofnąć ostatniego zatwierdzenia. nie powiedział, że dodał kilka plików, a następnie je zatwierdził. więc najwyraźniej chce ostatniego zatwierdzenia.
Paul
1
Trudno jest znaleźć odpowiedź na to bardzo częste pytanie
Sam

Odpowiedzi:

211

Caveat Emptor - Niszczycielskie rozkazy przed nami.

Łagodzenie - git reflog może cię uratować, jeśli tego potrzebujesz.


1) COFNIJ zmiany lokalnego pliku i ZACHOWAJ ostatnie zatwierdzenie

git reset --hard

2) COFNIJ zmiany lokalnego pliku i USUŃ ostatnie zatwierdzenie

git reset --hard HEAD^

3) ZACHOWAJ zmiany w lokalnych plikach i USUŃ ostatnie zatwierdzenie

git reset --soft HEAD^
Joe Hanink
źródło
20
To polecenie usunie poprzednie zatwierdzenie, więc używaj go ostrożnie! reset git
hard
9
WTF robi to jako poprawna odpowiedź z 36 głosami pozytywnymi. Właśnie straciłem dni pracy na to ... ponieważ czytam odpowiedź, a nie komentarz. To nie jest prawidłowa odpowiedź na pytanie!
Chris Nevill
1
OK, nie wszystko stracone! Możesz zrobić git reflog, co pozwoli ci zobaczyć zatwierdzenia wykonane przed resetem. Następnie możesz sprawdzić te zobowiązania
Chris Nevill
3
Co jest warte, zinterpretowałem pytanie OP jako „jak cofnąć zatwierdzenie i usunąć bieżące pliki”, ale było i pozostaje niejednoznaczne. Zrozumiałbym inaczej, gdyby OP po prostu powiedział „jak usunąć bieżące pliki, które nie zostały dodane lub
zatwierdzone
2
Git jest przeciwieństwem stwierdzenia Alana Kaysa. Proste rzeczy powinny być proste, a złożone powinny być możliwe. ... zwłaszcza jego pierwszej części. Mimo to dziękuję za odpowiedź. pomogło.
0xC0000022L
46

Jeśli chcesz usunąć nowo dodane treści i pliki, które są już w fazie przejściowej (czyli dodane do indeksu), użyj:

git reset --hard

Jeśli chcesz usunąć także swoje ostatnie zatwierdzenie (to z komunikatem „bla”), lepiej użyj:

git reset --hard HEAD^

Aby usunąć nieśledzone pliki (czyli nowe pliki, które nie zostały jeszcze dodane do indeksu) i foldery, użyj:

git clean --force -d
Paul Pladijs
źródło
czy git reset --hard HEAD ^ usuwa moje ostatnie zatwierdzenie na stałe? nie mogę do tego wrócić?
user137717
wydaje „git czysty --force -d” również usuwa .gitignored foldery
Alexey Timokhin
15

git reset --hard wymusi powrót katalogu roboczego do ostatniego zatwierdzenia i usunie nowe / zmienione pliki.

SpliFF
źródło
2
zrobił to, ale pliki nadal tam są. (niezatwierdzone pliki nadal tam są)
Blankman,
w tym przypadku możesz zrobić „git stash”
jacktrade
3
głosowano za, ponieważ jest to jedyna jasna i jednoznaczna odpowiedź na jasne i jednoznaczne pytanie PO.
Paul
4

Możesz cofnąć zatwierdzenie, używając git revert HEAD^do powrotu do przedostatniego zatwierdzenia. Możesz także określić zatwierdzenie do cofnięcia za pomocą id zamiast HEAD ^

Sebastian Oliva
źródło
To nie „powraca” w sensie, o którym mówisz. Tworzy to odwrotne zatwierdzenie.
Stefan Kendall
4

Jeśli chcesz po prostu cofnąć zatwierdzenie ostatniego zatwierdzenia, użyj tego:

git reset HEAD~

działają dla mnie jak urok.

Abhishek saharn
źródło
2
to jest dokładna odpowiedź na pytanie
Deniz Kocaboğa
to powinna być zatwierdzona odpowiedź
amiabl
3

Łatwym i niezawodnym sposobem cofania zmian w pliku lokalnym od ostatniego zatwierdzenia jest umieszczenie ich w nowej gałęzi:

git branch changes
git checkout changes
git add .
git commit

Pozostawia to zmiany w nowej branży. Wróć do oryginalnej gałęzi, aby znaleźć ją z powrotem do ostatniego zatwierdzenia:

git checkout master

Nowa gałąź jest dobrym miejscem do ćwiczenia różnych sposobów cofania zmian bez ryzyka zepsucia oryginalnej gałęzi.

Terje Norderhaug
źródło