Git – cofanie ostatniej zmiany (commit’a)

Dzisiaj bardzo mała ale bardzo przydatna rzecz – cofanie zmian w git. Myślę że jest to rzecz którą powinien się nauczyć każdy użytkownik git’a zaraz po zatwierdzaniu zmian i umieszczaniu ich na serwerze.

Przy męczącej pracy bez kawy albo przez zwykłą pomyłkę może się nam zdarzyć zatwierdzenie zmian z których nie jesteśmy zadowoleni. Może to być poważny błąd w kodzie, którego nie chcielibyśmy w naszym repozytorium albo zatwierdzenie zmiany, która docelowo miała się znaleźć w innej gałęzi. Są na to dwa rozwiązania warte zapamiętania. Pierwsze bardziej uniwersalne, drugie nadające się do przypadku z pomyłką gałęzi.

Rozwiązanie

Cofanie się o krok w tył

Operacja reset służy nam do cofnięcia naszego głównego wskaźnika do wybranego przez nas miejsca. Poza tym możemy wybrać jeden z kilku dostępnych trybów. Ja się skupię na dwóch.

git reset --hard HEAD^ - używamy kiedy nie chcemy odzyskać zmodyfikowanych plików przed zatwierdzeniem. Stosujemy w przypadku kiedy napisaliśmy bardzo dużo bzdur i chcemy zacząć od nowa.
git reset --soft HEAD^ - miękkie cofanie zmian w tym przypadku oznacza zatrzymanie zmian i pozwolenie na ich poprawienie oraz późniejsze zatwierdzenie do repozytorium.

Po tych operacjach wystarczy poprawić kod, upewnić się że jesteśmy na właściwej gałęzi i jeszcze raz zatwierdzić git commit.

Przeniesienie ostatniej zmiany do nowej gałęzi

Ten sposób jest trochę bardziej zawiły i składa się z kilku kroków:

  1. git branch nazwa – na początku tworzymy nową gałąź, w tej chwili mamy identyczną historię jak gałąź główna,
  2. git checkout dev – w tym momencie cofamy się do naszej głównej gałęzi na której pracujemy (tutaj jest to 'dev’)
  3. git reset –hard HEAD^ – cofamy nasze zatwierdzenia na gałęzi głównej.

Oba sposoby są tak na prawdę wykorzystaniem tej samej operacji. Natomiast pokazują one jak wykorzystać operację w zupełnie inny sposób.

Komentarze

3 odpowiedzi na “Git – cofanie ostatniej zmiany (commit’a)”

  1. Awatar www.kajzarowie.net

    A co zrobic, jak poszedl commit na zdalna galaz i chcialabym go i wszystke zmiany skasowac?

  2. Awatar Marek Zdybel
    Marek Zdybel

    Nie można.
    Zacommitowane zmiany mogą już zostać pobrane przez inne osoby pracujące nad tematem.
    Chyba ze w błędzie jestem.

  3. Awatar Kasia Kajzar

    Można, tylko nie jest to bezpieczne z tego powodu, o którym pisałeś.

    Najpierw sprawdzamy sobie dokładnie ostatnie commity, żeby wiedzieć ile już wypuszczonych checemy cofnąć:
    git log -6

    Potem cofamy podając ilość commitów do cofnięcia (tutaj dwa):
    git reset –soft HEAD~2

    Potem lokalnie robimy sobie commita nowego i musimy go później wypushować z forcem, co nadpisze zmiany w repo zdalnym.

    Przydatne, jak pracuje się samemu, albo na własnej gałęzi – masz wtedy pewność, że nikt inny nie ściągnął sobie Twoich zmian i na nich nie pracuje.