Jaka jest różnica między git reset a git revert?

Praca z systemem kontroli wersji Git wymaga zrozumienia różnych poleceń i ich zastosowań. Dwa z najczęściej używanych, a jednocześnie często mylonych poleceń to git reset i git revert. Oba służą do zmiany historii w repozytorium, ale ich działanie, kontekst użycia oraz skutki są zupełnie różne. W tym artykule wyjaśnimy, czym się różnią i kiedy najlepiej ich używać.

Co to jest git reset?

git reset to potężne polecenie, które pozwala na przesuwanie wskaźnika HEAD, zmieniając stan plików w obszarze roboczym (working directory) oraz w indeksie (staging area). Może być używane do usuwania zmian z historii, cofania plików z obszaru indeksowania lub resetowania całego stanu repozytorium.

Składnia polecenia git reset

git reset [opcje] [commit]

Opcje git reset definiują zakres zmian, które mają zostać cofnięte. Najczęściej używane opcje to:

  • --soft: Resetuje wskaźnik HEAD, ale zachowuje zmiany w indeksie i obszarze roboczym.
  • --mixed (domyślnie): Resetuje HEAD i indeks, ale nie zmienia obszaru roboczego.
  • --hard: Resetuje HEAD, indeks i obszar roboczy, usuwając wszystkie zmiany.

Przykłady użycia git reset

Aby cofnąć ostatni commit, ale zachować zmiany w obszarze roboczym:

git reset --soft HEAD~1

Aby usunąć ostatni commit i zmiany z indeksu, ale nie z obszaru roboczego:

git reset --mixed HEAD~1

Aby całkowicie usunąć ostatni commit i wszystkie zmiany:

git reset --hard HEAD~1

Co to jest git revert?

git revert to polecenie służące do wprowadzania nowego commitu, który odwraca zmiany wprowadzone przez wcześniejszy commit. W przeciwieństwie do git reset, nie usuwa historii, co czyni je bardziej bezpiecznym narzędziem w pracy zespołowej.

Składnia polecenia git revert

git revert [opcje] [commit]

Podstawowe zastosowanie polega na wskazaniu konkretnego commitu, który ma zostać odwrócony. Git automatycznie tworzy nowy commit z odpowiednimi zmianami.

Przykłady użycia git revert

Aby odwrócić ostatni commit:

git revert HEAD

Aby odwrócić konkretny commit, używając jego identyfikatora (hash):

git revert 

Jeżeli chcemy odwrócić kilka commitów jednocześnie:

git revert HEAD~3..HEAD

Różnice między git reset a git revert

Główne różnice między tymi dwoma poleceniami można podsumować w poniższej tabeli:

Funkcja git reset git revert
Cofanie zmian Usuwa zmiany z historii Tworzy nowy commit odwracający zmiany
Bezpieczeństwo Niebezpieczne w pracy zespołowej (może prowadzić do konfliktów) Bezpieczne w pracy zespołowej
Stan historii Może zmodyfikować istniejącą historię Nie zmienia istniejącej historii
Użycie Przy lokalnych zmianach lub korekcie historii Do odwracania zmian w już opublikowanej historii

Kiedy używać git reset?

git reset jest najlepszym wyborem, gdy pracujesz na lokalnym branchu i chcesz:

  • Cofnąć niechciane zmiany przed ich publikacją.
  • Usunąć commit, który nie powinien być częścią historii.
  • Przywrócić stan repozytorium do wcześniejszego punktu w czasie.

Pamiętaj, że git reset --hard usuwa zmiany wprowadzone w obszarze roboczym, co może prowadzić do utraty danych, jeśli nie zostały one zapisane gdzie indziej.

Kiedy używać git revert?

git revert jest idealne w pracy zespołowej, gdy:

  • Chcesz odwrócić zmiany w opublikowanej historii bez jej modyfikowania.
  • Potrzebujesz zachować pełną historię zmian, w tym te odwrócone.
  • Nie chcesz ryzykować konfliktów w branchach współdzielonych przez zespół.

Podsumowanie

Choć git reset i git revert mają podobny cel – cofanie zmian – różnią się znacząco pod względem działania, zastosowania i bezpieczeństwa. Wybór odpowiedniego narzędzia zależy od kontekstu: czy pracujesz samodzielnie, czy w zespole, oraz czy zmiany zostały już opublikowane.

Znajomość różnic między tymi poleceniami jest kluczowa dla skutecznej pracy z Gitem i unikania problemów związanych z historią repozytorium. Dzięki temu możesz lepiej zarządzać swoim kodem i pracą zespołu, utrzymując przejrzystość i spójność historii projektu.