Git: cofanie commita
Ostatnia aktualizacja
Sposób cofnięcia commita zależy od tego, który to commit i czy jest już wypchnięty. Starszy commit ukryty w historii, albo cokolwiek już udostępnionego, wymaga git revert, które dodaje nowy commit odwracający zmiany, niczego nie przepisując. Serię ostatnich lokalnych commitów można po prostu usunąć przez git reset. Jeśli chcesz cofnąć tylko ostatni commit, strona git undo last commit omawia każdy wariant tej szybkiej poprawki.
Wypróbuj te polecenia w terminalu online: prawdziwa powłoka w przeglądarce, bez żadnej instalacji.
Którego polecenia użyć
| Sytuacja | Polecenie |
|---|---|
| Cofnąć jeden starszy commit, zachować wszystko po nim | git revert <hash> |
| Cofnąć commit, który jest już wypchnięty | git revert <hash> |
| Cofnąć 3 ostatnie lokalne commity, zachować pracę | git reset --soft HEAD~3 |
| Cofnąć 3 ostatnie lokalne commity, odrzucić pracę | git reset --hard HEAD~3 |
| Cofnąć zakres nowymi commitami odwracającymi | git revert HEAD~3..HEAD |
reset vs revert
| Zachowanie | git reset | git revert |
|---|---|---|
| Przepisuje historię | Tak | Nie |
| Bezpieczny przy wypchniętych commitach | Nie | Tak |
| Tworzy nowy commit | Nie | Tak |
| Działa na starych commitach w środku historii | Nie | Tak |
| Może odrzucić zmiany | Tak (--hard) | Nie |
Przykład krok po kroku
Cofnij konkretny starszy commit, nawet już wypchnięty, bez ruszania commitów, które przyszły po nim.
| Krok | Polecenie | Wynik |
|---|---|---|
| 1 | git log --oneline | Znajdź hash złego commita (np. a1b2c3d) |
| 2 | git revert a1b2c3d | Nowy commit go odwraca; późniejsze commity są nietknięte |
| 3 | git push | Udostępnij poprawkę: historia nie została przepisana |
Najczęstsze pytania o cofanie commita
Jak cofnąć starszy commit bez utraty commitów, które są po nim?
git revert <hash>. Revert tworzy nowy commit, który odwraca tylko wskazany commit; każdy późniejszy commit zostaje dokładnie taki, jaki był. Najpierw znajdź hash przez git log --oneline. Jeśli revert koliduje z późniejszymi zmianami, Git się zatrzymuje: rozwiąż konflikt i uruchom git revert --continue.Jak cofnąć kilka commitów naraz?
git reset --soft HEAD~3 usuwa trzy ostatnie i zostawia ich zmiany w poczekalni (użyj --hard, żeby je odrzucić). Przy commitach wypchniętych cofnij zakres przez revert: git revert --no-commit HEAD~3..HEAD odwraca wszystkie trzy, a potem jeden git commit zapisuje cofnięcie.Jak cofnąć commit, który jest już wypchnięty?
git revert <hash> zamiast reset. Revert tworzy nowy commit, który cofa zmiany docelowego commita i zostawia historię nietkniętą. To bezpieczny sposób na cofanie wspólnych commitów: przepisanie wypchniętej historii przez reset zmusza pozostałych do ręcznego uzgadniania swoich kopii.