Git jest git: Cofnięcie wypchniętego commita

Sytuacja jest prosta – chcemy wycofać ostatni, już push’nięty commit z repozytorium. Aby tego dokonać należy:

  1. Cofnąć lokalne repozytorium o jeden commit
    git reset --hard HEAD~1
  2. Wykonać force-push do zdalnego repozytorium
    git push -f origin Sprint5/SON-234

Aby operacja zakończyła się sukcesem, to na docelowym branchu musi być dozwolona modyfikacja historii repozytorium (odznaczona opcja Prevent rewriting history). Warto tutaj również wspomnieć, iż nie zalecane jest stosować tej praktyki na głównym branchu, lecz tylko na feature branchach.

undo-pushed-commit


Revert

Jeśli uprawnienia na branchu nie zezwalają na modyfikację historii, to nie pozostaje nic innego jak revert, czyli utworzenie commita odwracającego zmiany. W tym wypadku należy:

  1. Utworzyć commit cofający zmiany
    git revert HEAD

    GIT automatycznie zasugeruje opis commita w postaci: Revert „xxx”

  2. Wypchnąć zmiany do zdalnego repozytorium
    git push

revert-pushed-commit

Podbij ↑

What do you think?
Like Love Haha Wow Sad Angry
310

8 thoughts on “Git jest git: Cofnięcie wypchniętego commita

  1. Brakuje tylko informacji, że pierwszego podejście nie powinno się stosować, jeśli nie chce się narobić problemów reszcie zespołu. Nadpisywanie historii zdalnego repozytorium nie należy do 'good practice'

  2. Jeśli ktoś robi code review z gerritem lub innym gitolubnym narzędziem (build+testy+recenzja kolegi) to problemy z pchnięciem złego kodu na mastera w dużej mierze da się wyeliminować.

    Co do feature branchy to muszę przyznać że często korzystam z git reset dlatego że lubię robić wiele commitów checkpoint’ów a przed pchnięciem na serwer najczęściej zamieniam jest w jeden właściwy commit (squash via git rebase -i). Warto tutaj wspomnieć też o poleceniu git reflog które nieraz już ratowało mnie z poważnych tarapatów – zwłaszcza jeżeli git reset wyciachał za dużo :)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *