Sytuacja kobiet w IT w 2024 roku
24.03.20203 min
Christian Walter

Christian WalterFirmware Developer9elements

Jak cofnąć commit w git

Dowiedz się, jakie kroki należy wykonać, aby w poprawny sposób cofnąć niepożądany commit lokalny oraz zdalny w git.

Jak cofnąć commit w git

Wielu programistów ma problem z cofaniem commitów w git, a czasem zdarzy się zatwierdzić zmiany, których zatwierdzać się nie powinno. Chciałbym Wam pokazać, jak cofnąć te zmiany lokalnie lub zdalnie. Zasadniczo dany plik może być w trzech różnych stanach: untracked, unstaged lub staged. Pliki o statusie untracked nigdy jeszcze nie zostały dodane do drzewa, co oznacza, że są zupełnie nowe.

Pliki o statusie unstaged były już w drzewie, ale zostały zmodyfikowane. Zmiany te można dodać do plików w następnym stanie, czyli tych o statusie staged.

Pliki o statusie staged to z kolei te, które przechodzą do następnego commita. Jeśli wpiszesz git status w swoim repozytorium, to też zobaczysz te trzy stany.

git status - różne stany pliku

Usuń nowe pliki z obszaru staged

Pliki staged to te, które trafią do następnego commita. Jeśli przypadkowo dodało się pliki do obszaru staged, to można to cofnąć przez wpisanie git restore --staged<plik>. W takim przypadku będzie to git restore --staged lib.c.

Plik lib.c zostałby ponownie przeniesiony do obszaru untracked, ponieważ jest zupełnie nowy. Wprowadzone zmiany będą nadal dostępne. Jeśli ich jednak już nie potrzebujesz, to możesz po prostu usunąć plik.

Usuń istniejące pliki z obszaru staged

Jeśli plik był już w drzewie, możesz albo zachować wprowadzone zmiany, albo zresetować go do ostatniego commita. git restore --staged<file> ponownie przeniesie plik z obszaru staged do obszaru unstaged.

Jeśli chcesz zresetować plik do stanu z ostatniego commita, to najpierw trzeba go usunąć z obszaru staged, a następnie przywrócić plik do najnowszego commita wpisując git restore<file>.

Przenoszenie plików pomiędzy obszarami jest proste, ale co jeśli zostały one już zatwierdzone i trzeba cofnąć ostatni commit? Zobaczmy, jak możemy to rozwiązać.

Cofanie Commita

Załóżmy więc, że trzeba cofnąć ostatni commit, ale chcesz zachować wprowadzone zmiany. Twoje commity w drzewie roboczym wyglądają tak:

Twój aktualny commit to Add superDuper.d. Chcesz go teraz cofnąć, ale jednocześnie zachować zmiany. Zmiany zostaną przeniesione z commita do obszaru unstaged/untracked. git reset HEAD^ zresetuje Twoje drzewo do commita przed tym, w którym jesteś teraz. HEAD^ to skrót od HEAD-1, a HEAD jest tam, gdzie aktualnie znajduje się Twój katalog roboczy.

Jeśli chcesz odrzucić commit bez zachowania zmian, dodaj --hard do polecenia git reset --hard HEAD^. Uważaj jednak, ponieważ usuwa to zmianę dokonaną w commicie.

Wycofanie zmian w zdalnym commicie

Ostatnią rzeczą, której potrzebujesz w zestawie narzędzi git to wycofanie zmian. Oznacza to po prostu cofanie ostatniego commita, ale problem polega niestety na tym, że drzewo jest już zsynchronizowane ze zdalnym repozytorium, a zatem usunięcie commita nie będzie takie proste.

To, co naprawdę trzeba zrobić, to cofnąć zmiany w oddzielnym commicie. W tym celu można posłużyć się git revert HEAD. Pobiera on ostatni commit i wprowadza kod znoszący zmiany dokonane ostatnim commitem i tworzy z tego nowy commit. Sprawdźmy więc naszą aktualną historię git.

Teraz chcemy wycofać ostatni commit, w którym dodaliśmy plik database.md.git revert HEAD wycofa dodanie tego pliku, ale nasze drzewo wyglądałoby wtedy tak:


Możesz teraz zapisać zmiany dokonane w remote i w taki oto sposób możesz cofnąć ostatni commit.

Oryginał tekstu w języku angielskim możesz przeczytać tutaj.

<p>Loading...</p>