🢂Jak cofnąć commit w Git?

Cofanie ostatniego commitu w Git - praktyczne przykłady.

Jeśli commit jest w lokalnym repozytorium?

Aby cofnąć ostatni lokalny commit w Git, możesz użyć jednej z poniższych metod, w zależności od tego, czy chcesz zachować zmiany z commitu w lokalnym katalogu roboczym, czy całkowicie je usunąć:

1. Zachowanie zmian w katalogu roboczym

Jeśli chcesz cofnąć commit, ale zachować jego zmiany jako niezatwierdzone (tzw. staged changes):

git reset --soft HEAD~1
  • HEAD~1 oznacza ostatni commit.
  • Zmiany zostaną przeniesione do obszaru indeksu (staging area), dzięki czemu możesz je ponownie edytować lub zatwierdzić.

2. Zachowanie zmian tylko w katalogu roboczym

Jeśli chcesz cofnąć commit i usunąć zmiany z obszaru indeksu, ale pozostawić je w katalogu roboczym:

git reset --mixed HEAD~1

3. Całkowite usunięcie zmian

Jeśli chcesz cofnąć commit i całkowicie usunąć wprowadzone zmiany:

git reset --hard HEAD~1

Uwaga: Wszystkie zmiany wprowadzone w cofanym commicie zostaną utracone i nie będą dostępne w katalogu roboczym.

Co jeśli commit został już wypchnięty do zdalnego repozytorium?

Jeśli commit został już wypchnięty do zdalnego repozytorium i chcesz cofnąć zmiany, masz kilka opcji. Wybór metody zależy od tego, czy chcesz usunąć commit z historii, czy po prostu cofnąć zmiany w inny sposób. Oto kilka możliwości:

Jeśli chcesz cofnąć zmiany, ale nie chcesz zmieniać historii

Jeśli chcesz cofnąć zmiany wprowadzane przez określony commit, ale nie chcesz zmieniać historii, użyj polecenia git revert. To polecenie tworzy nowy commit, który odwraca zmiany wprowadzone przez wybrany commit.

git revert <commit_hash>
git push origin <branch_name>

Jeśli chcesz usunąć commit z historii

Jeśli chcesz usunąć commit z historii, możesz użyć git reset. Jednak ta metoda jest bardziej ryzykowna, zwłaszcza jeśli commit został już wypchnięty do zdalnego repozytorium, ponieważ zmienia historię commitów. Użyj tej metody tylko wtedy, gdy masz pewność, że nikt inny nie bazuje na tych commitach.

git reset --hard HEAD~1
git push origin <branch_name> --force
  • Użyj --soft, jeśli chcesz zachować zmiany w staging area:
git reset --soft HEAD~1
git push origin <branch_name> --force

Jeśli chcesz zachować historię, ale jednocześnie wprowadzić zmiany

W tym celu możesz stworzyć nowy branch z aktualnego stanu i wprowadzić tam poprawki.

git checkout -b new-branch
# Wprowadź zmiany
git commit -m "Poprawki"
git push origin new-branch

Podsumowanie

Jeśli zdecydujesz się na git reset i --force, pamiętaj, aby poinformować zespół, aby uniknąć konfliktów. Inni członkowie zespołu mogą mieć lokalne kopie commitów, które usuniesz.

Wybór metody zależy od sytuacji i twoich potrzeb. git revert jest najbezpieczniejszą opcją, gdyż nie zmienia historii, podczas gdy git reset wymaga ostrożności, gdyż może prowadzić do problemów, jeśli inni członkowie zespołu bazują na commitach, które zamierzasz usunąć.