Middle
Jak w Twojej firmie przebiega łączenie gałęzi (merge) lub przepisywanie historii (rebase) w systemie kontroli wersji?
sobes.tech AI
Odpowiedź od AI
W naszym zespole stosujemy workflow oparty na Git. Aby integrować zmiany, używamy dwóch głównych podejść: merge i rebase, wybierając je w zależności od sytuacji i typu gałęzi.
Merge:
- Zazwyczaj stosuje się go do łączenia długotrwałych gałęzi, np. dev z main, lub do integracji gałęzi funkcji z dev.
- Tworzy commit scalający, który wyraźnie pokazuje, kiedy nastąpiła integracja zmian z innych gałęzi.
- Zachowuje pełną historię commitów, w tym wszystkie rozgałęzienia.
git checkout dev // Przełącz na gałąź docelową
git merge feature/nowa-funkcja // Scal gałąź funkcji
Rebase:
- Używany do utrzymania czystej i liniowej historii commitów na gałęziach funkcji do momentu ich integracji (zwykle w dev).
- Przenosi commity bieżącej gałęzi na szczyt gałęzi docelowej (dev), efektywnie "przepisyując" historię.
- Upraszcza historię, unikając commitów scalających dla każdej małej funkcji lub poprawki.
- Ważne: Nigdy nie wykonuj rebase na publicznych gałęziach, nad którymi pracują inni programiści, ponieważ może to powodować konflikty przy pobieraniu zmian.
git checkout feature/nowa-funkcja // Przełącz na gałąź funkcji
git rebase dev // Przenieś commity gałęzi funkcji na szczyt dev
// Jeśli to konieczne, rozwiązuj konflikty
git push --force-with-lease // Użyj --force-with-lease dla bezpiecznego push po rebase
Nasz standardowy workflow:
- Nowa funkcja lub poprawka jest rozwijana w osobnej gałęzi (feature/..., fix/...).
- Od czasu do czasu (przed pull requestem lub w celu synchronizacji z dev) gałąź funkcji jest rebase'owana na aktualną wersję dev. Pomaga to rozwiązać konflikty na wczesnym etapie.
- Po zakończeniu rozwoju i przeglądzie kodu, gałąź funkcji jest scalana do
devzno-ff(non-fast-forward), aby zachować informacje o scaleniu. Rzadziej, jest ona squashowana do jednego commita przed scaleniem dodevdla bardzo małych funkcji lub poprawek. - Z
devregularnie tworzone są wydania wmain(gałęzi produkcyjnej), zawsze za pomocą merge.
W ten sposób balansujemy zachowanie historii commitów (merge) z utrzymaniem czystej gałęzi rozwojowej (rebase gałęzi funkcji).