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.
Trzy tryby
| Tryb | Przesuwa gałąź | Resetuje poczekalnię | Resetuje katalog roboczy |
|---|---|---|---|
--soft | Tak | Nie | Nie |
--mixed (domyślny) | Tak | Tak | Nie |
--hard | Tak | Tak | Tak |
Składnia
| Polecenie | Co robi |
|---|---|
git reset --soft HEAD~1 | Cofa ostatni commit, zmiany zostają w poczekalni |
git reset HEAD~1 | Cofa ostatni commit, zmiany zostają poza poczekalnią |
git reset --hard HEAD~1 | Cofa ostatni commit i odrzuca zmiany |
git reset <file> | Usuwa plik z poczekalni (zmiany zostają) |
git reset --hard origin/main | Wymusza zgodność lokalnej gałęzi ze zdalną |
Typowe przypadki
| Cel | Polecenie |
|---|---|
| Usunąć wszystko z poczekalni | git reset |
| Usunąć jeden plik z poczekalni | git reset README.md |
| Cofnąć się o 3 commity i zachować pracę | git reset --soft HEAD~3 |
| Wyrzucić wszystkie lokalne zmiany od danego commita | git reset --hard <hash> |
Najczęstsze pytania o git reset
Czym różnią się --soft, --mixed i --hard?
--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?
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ąć?
--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?
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?
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.