Git i narzędzia2 min czytania

Rebase czy merge? Krótka instrukcja bez religijnych wojen

Obie komendy łączą zmiany, ale zostawiają zupełnie inną historię. Kiedy co wybrać, jedna złota zasada i jak odkręcić błąd przez reflog.

git

Zdjęcie ilustracyjne: Unsplash

W każdym zespole prędzej czy później pada pytanie: „robimy rebase czy merge?”. Odpowiedź brzmi: jedno i drugie, tylko w innych miejscach. Obie komendy łączą zmiany z dwóch gałęzi, ale zostawiają po sobie inną historię.

Merge: historia taka, jaka była

git merge tworzy nowy commit z dwoma rodzicami. Nic nie jest przepisywane, więc to bezpieczne nawet na gałęziach, z których korzystają inni. Ceną jest historia z rozgałęzieniami, która przy dużym ruchu wygląda jak plan metra.

git switch main
git merge feature/login

Rebase: historia taka, jaką chcesz pokazać

git rebase bierze Twoje commity i odtwarza je na nowej bazie. Historia jest liniowa i czyta się ją jak opowieść. Ale commity dostają nowe hashe — to nowe obiekty, nawet jeśli zmiany są te same.

git switch feature/login
git rebase main
# po rozwiązaniu konfliktu:
git add . && git rebase --continue

Złota zasada: nie rób rebase gałęzi, na której pracuje ktoś poza Tobą.

Jak to połączyć w praktyce

SytuacjaWybór
Aktualizacja własnej gałęzi o zmiany z mainrebase
Porządki przed pull requestemrebase -i
Wlanie gotowej funkcji do mainmerge (lub squash)
Gałąź współdzielona przez kilka osóbmerge

Dwie linijki konfiguracji, które polecam każdemu: git pull zamiast zbędnych commitów scalających będzie robił rebase, a lokalne niezapisane zmiany zostaną automatycznie odłożone na bok.

git config --global pull.rebase true
git config --global rebase.autoStash true

Push po rebase

Po rebase zwykły git push zostanie odrzucony, bo historia się różni. Zamiast --force używaj --force-with-lease: nadpisze gałąź tylko wtedy, gdy nikt w międzyczasie nic do niej nie dorzucił.

Coś poszło nie tak? Reflog

Git prawie nic nie gubi. git reflog pokazuje, gdzie był HEAD przed każdą operacją, więc nieudany rebase cofa się jedną komendą.

git reflog
# a1b2c3d HEAD@{4}: rebase (start): checkout main
git reset --hard HEAD@{5}

Na koniec Spór „rebase czy merge” to zwykle spór o to, kto czyta historię. Ustalcie to w zespole raz, zapiszcie w CONTRIBUTING.md i wróćcie do pracy.

STOS

Blog o frontendzie, DevOps i narzędziach

Zbudowany na WordPressie: własny motyw blokowy, Polylang, Yoast SEO. Zobacz panel WordPressa w Playground ↗

STOS to fikcyjny blog — projekt koncepcyjny do portfolio. Autorka i treści są przykładowe.