Menu
Coddy logo textTech

Git Reset

Ostatnia aktualizacja

git reset przesuwa bieżącą gałąź na inny commit i, zależnie od trybu, dopasowuje do niego poczekalnię (indeks) i katalog roboczy. Trzy tryby różnią się tylko zasięgiem tej aktualizacji: --soft przesuwa gałąź i na tym koniec, --mixed (domyślny) resetuje też poczekalnię, a --hard dodatkowo nadpisuje twoje pliki robocze.

Ponieważ --hard usuwa niezatwierdzoną pracę, zanim go uruchomisz, upewnij się, którego trybu potrzebujesz. Przy commitach, które są już wypchnięte, lepiej użyć git revert. Wypróbuj to bezpiecznie w terminalu online: prawdziwa powłoka w przeglądarce.

git reset cofa HEAD do wcześniejszego commita; późniejsze commity wypadają z gałęzi, ale można je odzyskać przez reflog.

Trzy tryby

TrybPrzesuwa gałąźResetuje poczekalnięResetuje katalog roboczy
--softTakNieNie
--mixed (domyślny)TakTakNie
--hardTakTakTak

Składnia

PolecenieCo robi
git reset --soft HEAD~1Cofa ostatni commit, zmiany zostają w poczekalni
git reset HEAD~1Cofa ostatni commit, zmiany zostają poza poczekalnią
git reset --hard HEAD~1Cofa ostatni commit i odrzuca zmiany
git reset <file>Usuwa plik z poczekalni (zmiany zostają)
git reset --hard origin/mainWymusza zgodność lokalnej gałęzi ze zdalną

Typowe przypadki

CelPolecenie
Usunąć wszystko z poczekalnigit reset
Usunąć jeden plik z poczekalnigit reset README.md
Cofnąć się o 3 commity i zachować pracęgit reset --soft HEAD~3
Wyrzucić wszystkie lokalne zmiany od danego commitagit reset --hard <hash>

Najczęstsze pytania o git reset

Czym różnią się --soft, --mixed i --hard?
Wszystkie trzy przesuwają wskaźnik gałęzi na docelowy commit; różnią się tym, co jeszcze zmieniają. --soft nie zmienia nic więcej, więc zmiany zostają w poczekalni. --mixed (domyślny) czyści też poczekalnię, więc zmiany wypadają z niej, ale zostają w plikach. --hard dodatkowo nadpisuje katalog roboczy, żeby odpowiadał docelowemu commitowi, i odrzuca niezatwierdzone zmiany.
Jak usunąć plik z poczekalni przez git reset?
Uruchom git reset <file> (na przykład git reset README.md) albo git reset bez ścieżki, żeby usunąć z poczekalni wszystko. Plik znika z poczekalni, ale twoje zmiany zostają w katalogu roboczym. W nowszym Git możesz też użyć git restore --staged <file>, które robi to samo w bardziej jawny sposób.
Czy git reset --hard da się cofnąć?
Nie w katalogu roboczym: --hard trwale odrzuca niezatwierdzone zmiany. Jednak zatwierdzoną pracę, którą usunął reset, zwykle da się odzyskać: uruchom git reflog, żeby znaleźć hash commita, a potem git reset --hard <hash> (albo utwórz na nim gałąź). Zmian, które nigdy nie trafiły do poczekalni ani do commita, odzyskać się nie da, więc używaj --hard ostrożnie.
Czym różni się git reset od git revert?
git reset przepisuje historię, przesuwając gałąź do tyłu. To w porządku przy lokalnych commitach, ale niebezpieczne przy commitach już wypchniętych. git revert zostawia historię nietkniętą i dodaje nowy commit, który cofa wcześniejszy; to bezpieczny wybór na wspólnych gałęziach.
Co robi git reset --soft HEAD~1?
Cofa ostatni commit, ale wszystko, co ten commit zmienił, zostaje w poczekalni. HEAD~1 oznacza commit o jeden wcześniejszy od bieżącego, więc gałąź cofa się o krok, a poczekalnia i katalog roboczy zostają bez zmian. To najszybszy sposób, żeby zrobić commit od nowa: popraw pliki albo wiadomość i zatwierdź ponownie. Inne opcje opisuje git undo last commit.
Co oznacza HEAD~1?
HEAD to commit, na którym jesteś, a ~1 oznacza jego pierwszego rodzica, czyli commit o jeden wcześniejszy. HEAD~2 to dwa commity wstecz i tak dalej. Dla zwykłego commita HEAD^ to to samo co HEAD~1.
Czy mogę to przećwiczyć online?
Tak. Otwórz terminal online i uruchom git reset w prawdziwej powłoce w przeglądarce, bez żadnej instalacji. Darmowy interaktywny kurs Git w Coddy też krok po kroku omawia resetowanie i cofanie zmian.
Ilustracja języków programowania w Coddy

Ucz się Gita z Coddy

ZACZNIJ