Jak wygląda praca zespołowa nad aplikacją? Git, gałęzie i pull requesty

Mateusz Bogolubow

Mateusz Bogolubow

26-10-2026

(aktualizacja: 26-10-2026)

Zobacz, jak zespół programistów tworzy aplikację: od zadania, przez gałąź i pull request, po wdrożenie. Dowiesz się, skąd w tym procesie biorą się konflikty i jak je ograniczać.

Jak wygląda praca zespołowa nad aplikacją? Git, gałęzie i pull requesty
Zespół tworzy aplikację równolegle: każda osoba bierze zadanie, robi dla niego osobną gałąź w Git, wysyła zmiany jako pull request, ktoś je sprawdza (code review), a po akceptacji kod trafia do głównej gałęzi i na produkcję. Konflikty biorą się stąd, że kilka osób zmienia ten sam kod, zanim wszystkie zmiany się spotkają. Ogranicza je dzielenie pracy na małe zadania, krótkie gałęzie, częste pobieranie zmian z main i wspólne zasady formatowania.

Kiedy uczysz się sam, masz jedno repozytorium, jedną gałąź i pełną kontrolę nad każdą linijką. W zespole wszystko się zmienia: kilka osób dotyka tej samej aplikacji jednocześnie, a kod musi z tego wyjść spójny. Poniżej pokazujemy, jak taka praca wygląda od środka, dlaczego akurat w niej pojawiają się konflikty w Git i które nawyki sprawiają, że jest ich mniej.

Jak wygląda tworzenie aplikacji w zespole krok po kroku?

Szczegóły różnią się między firmami, ale schemat jest podobny prawie wszędzie:

EtapCo się dziejeEfekt
1. ZadanieZespół (z osobą odpowiedzialną za produkt) dzieli pracę na zadania w narzędziu typu Jira, Trello albo GitHub Issueslista zadań (backlog), każde z krótkim opisem
2. GałąźProgramista pobiera najnowszy kod i tworzy dla zadania osobną gałąźizolowana kopia, w której nie przeszkadza innym
3. KodPisze funkcję, testy i robi commityzmiany na własnej gałęzi
4. Pull requestWysyła gałąź na GitHub i otwiera pull request (PR) z opisemmiejsce do rozmowy o zmianie
5. Review i testyInna osoba czyta kod (code review), a automatyczne testy (CI) sprawdzają, czy nic się nie zepsułouwagi, poprawki, zielone testy
6. ScaleniePo akceptacji gałąź trafia do mainfunkcja jest częścią aplikacji
7. WdrożenieAplikacja z nowym kodem trafia do użytkownikówzmiana działa na produkcji

W tym schemacie nikt nie pracuje bezpośrednio na main. To gałąź „prawdy”: ma zawsze działać i na niej opiera się wdrożenie. Dlatego firmy często włączają w GitHubie ochronę gałęzi, która wymaga pull requesta i zaakceptowanego review, zanim cokolwiek do niej trafi.

Jeśli jesteś na początku drogi i dopiero wchodzisz do takiego procesu, podobnie wygląda pierwszy tydzień w nowej pracy. Pomocny jest wtedy buddy dla nowego członka zespołu, czyli osoba, która tłumaczy zasady, których nie ma w dokumentacji.

Dlaczego w zespole pracuje się na osobnych gałęziach?

Bo bez nich każdy zapisywałby swoje zmiany w tym samym miejscu i przeszkadzał innym w trakcie pracy. Gałąź (ang. branch) daje trzy rzeczy:

  • Izolację. Niedokończona funkcja Anny nie psuje aplikacji, nad którą pracuje Piotr.
  • Miejsce na review. Zmiany można przeczytać i skomentować, zanim trafią do wspólnego kodu.
  • Łatwe wycofanie. Jeśli pomysł się nie sprawdzi, gałąź można porzucić bez śladu w main.

Cena jest taka, że każda gałąź z czasem się „oddala” od main, bo w tym czasie ktoś inny scala własne zmiany. Im dłużej gałąź żyje, tym więcej różnic trzeba w końcu pogodzić. I tu zaczyna się temat konfliktów.

Jak utworzyć branch (gałąź) w Git i przełączać się między gałęziami?

Branch to po prostu nazwana linia zmian w repozytorium. Domyślnie masz jedną, zwykle main. Resztę tworzysz sam, najczęściej po jednej na zadanie.

Utwórz nowy branch i od razu na niego przejdź:

git switch -c feature/koszyk

Git odpowie: Switched to a new branch 'feature/koszyk'. Starsze poradniki używają git checkout -b feature/koszyk i też działa, ale git switch jest nowszy i jaśniejszy.

Sprawdź, na jakim branchu jesteś i jakie są inne:

git branch

Gwiazdka przy nazwie oznacza branch, na którym pracujesz. Samą bieżącą nazwę wypisze git branch --show-current. Żeby zobaczyć też branche ze zdalnego repozytorium (np. z GitHuba), użyj git branch -a.

Przełącz się na inny branch:

git switch main

Wyślij swój branch na GitHub:

git push -u origin feature/koszyk

Parametr -u zapamiętuje powiązanie z wersją zdalną, więc kolejne git push i git pull na tym branchu nie wymagają już podawania nazwy.

Usuń branch po scaleniu:

git branch -d feature/koszyk

-d usunie branch tylko wtedy, gdy jego zmiany są już scalone, więc to bezpieczna wersja. Wersję zdalną usuwasz osobno: git push origin --delete feature/koszyk.

Chcę…Polecenie
utworzyć branch i przejść na niegogit switch -c nazwa
zobaczyć lokalne branchegit branch
zobaczyć też branche zdalnegit branch -a
przełączyć się na istniejący branchgit switch nazwa
wysłać nowy branch na GitHubgit push -u origin nazwa
usunąć scalony branch lokalniegit branch -d nazwa

Dlaczego Git nie pozwala przełączyć się na inny branch?

Jeśli masz niezapisane zmiany w pliku, który różni się między branchami, Git odmówi przełączenia, żeby ich nie nadpisać:

error: Your local changes to the following files would be overwritten by checkout:
	f.txt
Please commit your changes or stash them before you switch branches.

Masz dwie drogi: zatwierdzić zmiany (git commit) albo schować je tymczasowo (git stash). To nie konflikt, tylko zabezpieczenie.

Jak nazywać branche w zespole?

Nazwa ma mówić, czego dotyczy zadanie. Zespoły często stosują prefiksy, np. feature/koszyk dla nowej funkcji i fix/blad-platnosci dla poprawki. Konkretną konwencję ustala zespół, ważne, żeby wszyscy używali tej samej i żeby nazwa odpowiadała zadaniu w Jirze lub GitHub Issues.

Skąd w pracy zespołowej biorą się konflikty?

Konflikt nie jest dowodem, że ktoś popełnił błąd. To naturalny skutek pracy równoległej: dwie osoby, każda na własnej gałęzi, zmieniły to samo miejsce, a Git przy łączeniu nie wie, którą wersję wybrać. Najczęściej dzieje się to w plikach, które dotyka wielu ludzi:

  • plik z listą tras lub menu, do którego każda nowa funkcja dopisuje jedną linię,
  • package.json, bo każdy dodaje własną bibliotekę,
  • wspólne style lub konfiguracja,
  • duży, „wielofunkcyjny” plik, w którym mieszka połowa logiki aplikacji,
  • pliki generowane (np. blokada zależności), jeśli ktoś je zmieni ręcznie.

Samo rozwiązywanie konfliktu (jak go przeczytać, wybrać wersję, dokończyć scalanie i wycofać się) opisujemy osobno w artykule o konfliktach w Git krok po kroku. Tutaj skupiamy się na tym, jak organizacja pracy sprawia, że konfliktów jest mniej.

Jak ograniczyć liczbę konfliktów w zespole?

NawykDlaczego to działa
Małe zadania i krótkie gałęzieim mniej czasu gałąź żyje, tym mniej zmian zdąży się nazbierać na main
Często pobieraj main do swojej gałęzikonflikt wykryjesz po jednym dniu pracy, a nie po trzech tygodniach, kiedy jest ich dziesięć
Jedna gałąź, jeden celpull request o jednej sprawie łatwiej przeczytać i łatwiej scalić
Rozmowa przed ruszeniem wspólnego plikujedno zdanie na czacie („zmieniam teraz routing”) potrafi uniknąć godziny rozwiązywania konfliktu
Podział odpowiedzialności za obszary kodugdy dwie osoby nie zmieniają tego samego modułu naraz, rzadziej wchodzą sobie w drogę
Wspólne formatowanie (Prettier, .editorconfig)znikają konflikty o spacje, wcięcia i średniki
Nie mieszaj refaktoryzacji z nową funkcjązmiana nazwy w 40 plikach „przy okazji” zamienia każdą cudzą gałąź w pole minowe

Dwa z tych punktów wymagają krótkiego omówienia.

Jak często aktualizować swoją gałąź względem main?

Najlepiej na początku każdego dnia pracy nad zadaniem, które trwa dłużej niż jeden dzień, oraz zawsze tuż przed otwarciem pull requesta. Robisz to jednym z dwóch poleceń:

git switch moja-funkcja
git merge main

albo, jeśli zespół woli liniową historię:

git switch moja-funkcja
git rebase main

Jedno i drugie przenosi do Twojej gałęzi nowości z main. Który wariant wybrać, ustala zespół, nie pojedyncza osoba, bo od tego zależy wygląd historii i sposób rozwiązywania ewentualnych konfliktów. Jak różnią się rodzaje łączenia (fast-forward, merge commit, squash, rebase) i kiedy każde z nich może dać konflikt, pokazujemy w artykule o konfliktach w Git.

Dlaczego formatowanie kodu ma związek z konfliktami?

Bo narzędzie do formatowania zmienia wiele linii naraz. Jeśli Anna ma w edytorze cztery spacje, a Piotr dwie, każde zapisanie pliku „zmienia” cały plik, a Git widzi to jako zmiany tych samych linii. Wspólna konfiguracja Prettiera lub pliku .editorconfig w repozytorium ustawia jedną regułę dla wszystkich i usuwa ten rodzaj konfliktów u źródła. Dobrze, gdy formatowanie uruchamia się też automatycznie, np. przy commicie.

Jaki model pracy z gałęziami wybrać?

Zespoły rzadko wymyślają własny schemat, najczęściej wybierają jeden ze znanych:

ModelJak działaKiedy ma sens
GitHub flowmain + krótkie gałęzie funkcji + pull requestwiększość zespołów, szczególnie przy częstych wdrożeniach
Git flowdodatkowe gałęzie develop, release, hotfixprojekty z wydaniami w ustalonych terminach
Trunk-basedwszyscy scalają do main bardzo często, w małych porcjachzespoły z dobrymi testami automatycznymi

Dla początkującego najważniejsza jest wspólna zasada, nie nazwa modelu: każdy wie, z jakiej gałęzi zaczyna, dokąd ją scala i kto ją akceptuje. Projekt, w którym trzy osoby używają trzech różnych schematów, produkuje więcej konfliktów niż jakikolwiek model teoretycznie „lepszy”.

Czy samo scalenie bez konfliktu oznacza, że kod działa?

Nie. Git ostrzega tylko wtedy, gdy zmieniono te same linie. Jeśli Anna zmieni nazwę funkcji, a Piotr w nowym pliku użyje starej, scalenie przejdzie bez słowa, a aplikacja przestanie działać. Dlatego w zespołach istnieją automatyczne testy (CI) uruchamiane na każdym pull requeście oraz review, a nie tylko polecenia Gita. Przykład takiego przypadku, sprawdzony w praktyce, opisujemy w artykule o konfliktach.

Dlaczego nie warto czekać z pull requestem, aż kod będzie „idealny”?

Początkujący często boją się otworzyć pull request, dopóki wszystko nie jest dopracowane. Skutek jest odwrotny od zamierzonego: im dłużej gałąź żyje, tym większy robi się pull request i tym więcej konfliktów trzeba rozwiązać. Lepiej wysłać mniejszą zmianę wcześniej i poprawić ją po uwagach z review.

Jak ćwiczyć pracę zespołową, gdy uczysz się sam?

Nawyki z tego tekstu można zbudować jeszcze przed pierwszą pracą:

  • Pracuj na gałęziach nawet we własnym projekcie. Jedna gałąź na jedno zadanie i pull request do samego siebie to trening bez ryzyka. Podstawy znajdziesz w artykule o clone, fork i pull request.
  • Poproś kogoś o review. Opis zmian i komentarze pod kodem uczą więcej niż samodzielne poprawki. Jak je robić i czego oczekiwać, wyjaśniamy w tekście o code review.
  • Pracuj w parze lub małym projekcie z drugą osobą. Pierwszy prawdziwy konflikt dużo uczy, a lepiej, żeby wydarzył się w projekcie treningowym niż w pracy. Pomysły na wspólne ćwiczenia znajdziesz w artykule o tym, co przyszli programiści mogą robić w parze.
  • Ćwicz komunikację. Sam Git nie nauczy Cię, jak zapytać kolegę, dlaczego wybrał takie rozwiązanie. O tym piszemy w artykule o umiejętnościach miękkich programisty.

W kursie JavaScript zadania zgłaszasz jako pull requesty, a mentor robi code review Twojego kodu, więc ten element pracy zespołowej ćwiczysz na własnych zadaniach i projektach.

Konsultacja i warsztaty devmentor.pl

Masz pytania?

Partnerzy

Firmy, z którymi współpracujemy

To partnerzy odpowiedzialni za staże po naszych kursach. Organizują je dla najlepszych absolwentów.

Zobacz wszystkich partnerów →
  • VR Medical
  • Sophona
  • Robot Force