Contributing guide krok po kroku: jak przygotować pierwszego pull requesta

0
35
1.7/5 - (3 votes)

Nawigacja:

Dlaczego w ogóle warto przygotować pierwszego pull requesta

Celem jest samodzielne, pewne i poprawne przejście całej ścieżki: od znalezienia zadania w projekcie open source, przez pracę z kodem i dokumentacją, aż po wysłanie pull requesta i reakcję na uwagi w code review. To nie tylko kwestia jednego PR-a, ale wyrobienia nawyków, które da się powtarzać w każdym kolejnym projekcie.

Korzyści z kontrybucji do open source

Kontrybucja do open source daje coś więcej niż wpis w CV. Najbardziej namacalne efekty to:

  • Nauka w realnym środowisku – zamiast sztucznych zadań z tutoriali dotykasz prawdziwego kodu, z prawdziwymi problemami i ograniczeniami. Widzisz, jak wygląda architektura większej aplikacji, jak zorganizowane są moduły, jak opisany jest kod.
  • Budowanie portfolio – link do konkretnych pull requestów na GitHubie jest bardziej wiarygodny niż zrzut ekranu z pet-projektu. Rekruter lub potencjalny współpracownik może zajrzeć do twojego kodu i dyskusji z maintainerami.
  • Kontakty z ludźmi z branży – przy powtarzających się kontrybucjach zaczynasz być kojarzony w społeczności projektu. To często prowadzi do współpracy, zaproszeń do innych projektów, a czasem do ofert pracy.
  • Wpływ na narzędzia, których używasz – poprawiasz błąd, który cię irytował, albo dodajesz brakujący fragment dokumentacji. Zmiana trafia do tysięcy użytkowników, w tym do ciebie samego.

Kontrybucja to też dobry test charakteru pracy w zespole rozproszonym: uczysz się akceptować uwagi do kodu, zadawać pytania, szukać kompromisów w rozwiązaniach. To są kompetencje, których często brakuje osobom z doświadczeniem wyłącznie hobbystycznym.

Realistyczne oczekiwania wobec pierwszego pull requesta

Pierwszy pull request rzadko jest od razu “idealny”. W wielu projektach:

  • Czas reakcji maintainerów może wynosić od kilku godzin do kilku tygodni. Osoby utrzymujące projekt mają swoją pracę, inne obowiązki i różne strefy czasowe.
  • PR może nigdy nie zostać zmergowany, nawet jeśli wykonałeś pracę – bo wymagania się zmieniły, bo temat okazał się nieaktualny, bo pojawiła się inna koncepcja rozwiązania. To normalne, choć bywa frustrujące.
  • Code review prawie zawsze wnosi poprawki – ktoś wspomni o stylu kodu, testach, lepszym podejściu. Traktuj to jak darmowy mentoring.

Sensowne nastawienie to: „uczę się procesu i pomagam projektowi”, a nie: „muszę jak najszybciej mieć zielonego PR-a do CV”. Pojedynczy PR jest mniej ważny niż zrozumienie standardów i przepływu pracy w open source.

Dobry moment na pierwszą kontrybucję

Nie każde okienko w życiu projektu jest dobre na start. Zanim zaczniesz, przejrzyj:

  • Ostatnie commity – jeśli widzisz duże refaktoryzacje, migracje frameworka czy przebudowę architektury, projekt może być w fazie chaosu. Zmiany szybko się przedawniają.
  • Otwartych PR-ów – jeśli jest ich bardzo dużo i wiszą długo bez odpowiedzi, projekt może być słabo utrzymywany. Nie jest to idealne miejsce na pierwszy kontakt.
  • Aktywność w issue – odpowiedzi maintainerów lub innych kontrybutorów pokazują, czy ktoś pilnuje kolejki zadań i reaguje na nowe osoby.

Najprostsza strategia: na początek celuj w proste, dobrze opisane issue, najlepiej oznaczone etykietami typu „good first issue”. Pierwsze wejście nie musi być spektakularne. Lepsza mała, domknięta zmiana, niż ambitny refaktor, który ugrzęźnie.

Postawa „pomagam projektowi”, nie „zaliczam PR”

Różnica widać w drobnych zachowaniach. Osoba nastawiona na pomoc:

  • czyta contributing guide krok po kroku i stosuje go, zamiast iść „po swojemu”,
  • pyta o kontekst, zanim zacznie większą zmianę,
  • dostosowuje się do stylu i praktyk zespołu,
  • jest gotowa poprawić PR po pierwszym code review, a nie obraża się na uwagi.

Z kolei ktoś, kto „zalicza PR”, często ignoruje istniejący workflow forka i brancha, tworzy gigantyczne zmiany, nie czyta dokumentacji, nie reaguje na komentarze. Taki styl raczej zamyka drzwi do współpracy, niż je otwiera.

Jak czytać contributing guide i co autorzy naprawdę komunikują

Contributing guide jest instrukcją, jak nie przeszkadzać projektowi i jak przygotować pierwszego pull requesta w sposób zgodny z oczekiwaniami zespołu. Im dokładniej go zrozumiesz, tym mniej niespodzianek przy code review.

Gdzie szukać contributing guide w projekcie

Najczęstsze lokalizacje plików z instrukcjami dla kontrybutorów:

  • CONTRIBUTING.md w root repozytorium – klasyczne miejsce, często linkowane z README.
  • docs/contributing.md lub docs/development.md – w projektach z rozbudowaną dokumentacją techniczną.
  • Wiki GitHuba – niektóre projekty przenoszą tam szczegółowe instrukcje, zostawiając w repo tylko skrót.
  • Sekcja w README – przy mniejszych repo contributing guide jest czasem sekcją w głównym pliku.

Jeśli w repo nic takiego nie ma, przejrzyj kilka najnowszych PR-ów. Zobaczysz, jak wygląda oczekiwany opis zmian, jak autorzy radzą sobie z testami, jak nazywają branche. To praktyczny „żywy contributing guide”.

Typowe sekcje contributing guide i co z nich wynika

Choć każdy projekt ma swoje szczegóły, większość contributing guide ma podobne bloki:

  • Wymagania techniczne – wersja języka (np. Python >= 3.10), frameworka, zależności, czasem konkretna wersja systemu. Często znajdziesz też wzmiankę o narzędziach typu pre-commit, black, eslint, flake8, prettier.
  • Styl kodu – formatowanie, konwencje nazewnicze, dopuszczalne biblioteki, wytyczne dotyczące komentarzy i dokumentacji (np. docstringi w stylu Google lub NumPy).
  • Proces tworzenia PR – czy używać forka, jak nazywać branche, jakie informacje podawać w opisie. Czasem opisany jest dokładny workflow: najpierw issue, później dyskusja, dopiero potem implementacja.
  • Zasady komunikacji – odwołanie do Code of Conduct, preferowany język (angielski / inny), sposób zgłaszania problemów i zadawania pytań.
  • CLA / licencja – czasem trzeba zaakceptować Contributor License Agreement lub wyraźnie zgodzić się na licencję projektu.

Ważne, by czytać te sekcje nie jak formalność, tylko jak instrukcję, dzięki której maintainerzy nie będą musieli po raz setny pisać tych samych uwag w PR-ze.

Na co patrzeć w pierwszej kolejności

Zanim wykonasz pierwszego commita, wyciągnij z contributing guide konkretne punkty:

  • Zakres akceptowanych zmian – czy projekt dopuszcza jedynie bugfixy, czy także nowe funkcje. Często jest wyraźnie napisane, że duże zmiany wymagają wcześniejszej dyskusji w issue.
  • Konwencje commitów – niektóre projekty wymagają np. Conventional Commits (feat:, fix:, docs: itd.), inne określają długość i styl wiadomości (imperatyw: „Add”, „Fix”, „Update”).
  • Testy i narzędzia jakości – które komendy trzeba uruchomić przed wysłaniem PR-a (np. npm test, pytest, make test, npm run lint). To podstawa check-listy przed PR.
  • Proces review – czy wymagane są dwie zatwierdzające recenzje, czy ktoś konkretny musi zaakceptować zmianę, czy obowiązują dodatkowe zasady (np. „nie mergujemy w piątki”).

Te informacje oszczędzają czas obu stron. Zamiast uczyć się na błędach w pierwszym PR-ze, zaczynasz z poziomu „gram według zasad projektu”.

Jak zamienić contributing guide na praktyczną checklistę

Dobre podejście to spisanie sobie mini-notatki dla każdego repozytorium. Przykładowa checklista z contributing guide może wyglądać tak:

  • Branch: nazwa w formacie feature/<issue-id>-krotki-opis.
  • Commity: styl Conventional Commits, max 72 znaki w pierwszej linii.
  • Lint: npm run lint przed push.
  • Testy: npm test i npm run test:e2e.
  • Opis PR: sekcje „Cel”, „Zmiany”, „Testy”, „Powiązane issue”.

Taką checklistę możesz trzymać jako plik tekstowy w swoim katalogu z repo lub jako notatkę w narzędziu, którego używasz. Przy kolejnych PR-ach wystarczy ją przejrzeć zamiast na nowo czytać cały contributing guide.

Kartki z prośbami o piosenki, długopisy i zapalone świece na stole
Źródło: Pexels | Autor: Madison Wooley

Dobór projektu i pierwszego zadania: jak znaleźć sensowną zmianę

Prawidłowy dobór projektu i pierwszego issue często decyduje, czy doświadczenie z open source będzie motywujące, czy zniechęcające. Nie chodzi o to, by wejść w „największy” projekt, ale w taki, który da ci realną szansę na ukończenie pierwszego pull requesta.

Kryteria wyboru projektu do pierwszej kontrybucji

Przy wyborze repozytorium zwróć uwagę na kilka praktycznych aspektów:

  • Technologia, którą znasz lub chcesz rozwinąć – jeśli programujesz w Pythonie, nie zaczynaj od dużego monolitu w C++. Możesz szukać projektów związanych z frameworkiem, którego używasz na co dzień.
  • Aktywność maintainerów – sprawdź daty ostatnich commitów, issue i merge PR-ów. Jeśli w projekcie nic się nie dzieje od miesięcy, nie jest to dobre miejsce na pierwszy wkład.
  • Jakość dokumentacji – przejrzyj README, contributing guide, sekcje „Development” lub „How to run tests”. Im lepiej opisany projekt, tym łatwiej wejść w kod.
  • Liczba i stan otwartych PR-ów – jeśli jest ich setki i większość czeka miesiącami bez odpowiedzi, trudno będzie doczekać się feedbacku do twojego PR-a.
Cecha projektuDobra oznaka dla pierwszego PRZła oznaka dla pierwszego PR
Aktywność commitówCommity sprzed kilku dni / tygodniBrak commitów od wielu miesięcy
Otwartych PR-ówUmiarkowana liczba, część zamykana co tydzieńDużo PR-ów wiszących bez odpowiedzi
DokumentacjaCzytelne README, sekcja „Contributing”Brak opisów, same pliki z kodem
Etykiety issue„good first issue”, „help wanted”, „documentation”Chaos w etykietach, brak opisów

Jak szukać pierwszych zadań w repozytorium

GitHub i inne platformy dają gotowe filtry. Przydatne etykiety i sposoby szukania:

  • „good first issue” / „good-first-issue” – zadania specjalnie oznaczone jako dobre dla początkujących w projekcie. Często są to drobne poprawki, zadania dokumentacyjne, proste bugfixy.
  • „help wanted” – zadania, przy których maintainerzy wprost proszą o pomoc. Zwykle są trochę bardziej zaawansowane niż typowe „good first issue”, ale nadal dostępne.
  • „documentation” – świetna opcja na start, jeśli obawiasz się kodu. Uspójnienie dokumentacji, dopisanie brakującej sekcji, aktualizacja przykładów – to pełnoprawna kontrybucja.
  • Filtry GitHuba – możesz wyszukać np. wszystkie issue z „good first issue” w danej organizacji, korzystając z wyszukiwarki w stylu: is:issue is:open label:"good first issue" language:python.

Przy przeglądaniu zadań zacznij od tych, które mają:

  • konkretny opis oczekiwanego efektu,
  • przynajmniej jeden komentarz maintainera (oznacza, że temat jest „żywy”),
  • brak informacji o tym, że ktoś już nad tym pracuje.

Na co spojrzeć w issue przed wzięciem go na siebie

Nie każde issue z atrakcyjną etykietą faktycznie nadaje się na start. Szybka analiza przed deklaracją:

  • Data utworzenia i ostatniej aktywności – jeśli issue jest stare, a projekt bardzo się zmienił, problem może być nieaktualny.
  • Dopytanie w issue: jak się „zgłosić” do zadania

    Zanim zaczniesz pisać kod, pokaż maintainerom, że chcesz się zająć konkretnym problemem. To prosty komentarz, który oszczędza później nerwów, bo nikt nie pracuje równolegle nad tym samym.

    Praktyczny schemat komentarza w issue:

  • Krótko napisz, że chcesz podjąć się zadania.
  • Streść jednym–dwoma zdaniami, jak rozumiesz problem.
  • Zadaj maksymalnie 1–2 konkretne pytania, jeśli coś jest niejasne.

Przykładowy komentarz:

I'd like to work on this issue.

My plan:
- Add validation to the X form to prevent empty Y values
- Extend existing tests in `test_form_validation.py`

Does this align with what you had in mind?

Jeśli w projekcie panują kolejki do issue, maintainer może poprosić cię o potwierdzenie, że nadal działasz, albo przypisać ci zadanie na określony czas. Gdy się rozmyślisz lub zabraknie czasu, napisz wprost, że rezygnujesz – ktoś inny przejmie temat, a ty nie palisz mostów.

Przygotowanie środowiska i repozytorium: od forka do własnej gałęzi

Gdy issue jest uzgodnione, czas zbudować sobie bezpieczne „piaskownice”. To miejsce, w którym możesz testować zmiany bez ryzyka zepsucia głównego repozytorium.

Fork, klon, remote: minimalna konfiguracja Git

Dla większości publicznych projektów ścieżka wygląda podobnie:

  1. Fork repozytorium na swoim koncie GitHub (przycisk „Fork”).
  2. Sklonuj forka lokalnie:
    git clone git@github.com:twoj-login/nazwa-projektu.git
    cd nazwa-projektu
  3. Dodaj oryginalne repo jako upstream:
    git remote add upstream git@github.com:org-or-project/nazwa-projektu.git
    git remote -v

Od tego momentu:

  • origin – twój fork (tam będziesz pushować branch).
  • upstream – oryginalne repo (z niego będziesz pobierać świeże zmiany).

Aktualizowanie forka: prosta rutyna przed każdym zadaniem

Żeby uniknąć konfliktów, utrzymuj forka blisko aktualnego stanu głównego repo. Prosty rytuał przed rozpoczęciem pracy nad nowym issue:

git checkout main
git fetch upstream
git merge upstream/main
# lub równoważnie:
# git pull upstream main
git push origin main

Masz wtedy pewność, że nowy branch startuje z aktualnej wersji kodu, którą widzą maintainerzy.

Tworzenie brancha pod konkretne zadanie

Nie pracuj bezpośrednio na main. Każdy PR powinien mieć osobną gałąź. Zasada: jedna gałąź = jeden spójny temat.

Przykładowe nazwy brancha (inspirowane contributing guide projektu):

  • feature/123-add-validation-to-signup
  • fix/456-null-pointer-dashboard
  • docs/789-update-installation-guide

Tworzenie nowej gałęzi z aktualnego main:

git checkout main
git pull upstream main
git checkout -b feature/123-add-validation-to-signup

Taki schemat ułatwia maintainerom zorientowanie się, nad czym pracujesz, a tobie – utrzymanie porządku, gdy równolegle robisz kilka PR-ów w różnych repozytoriach.

Konfiguracja środowiska: minimalny setup, który zwykle wystarcza

Dokładne kroki znajdziesz w README lub contributing guide, ale schemat dla większości projektów jest podobny. Przykładowe zestawy:

  • Node.js / frontend:
    npm install
    npm run dev       # tryb deweloperski
    npm test          # testy jednostkowe
    npm run lint      # linting
  • Python / backend:
    python -m venv venv
    source venv/bin/activate  # Linux/macOS
    # .venvScriptsactivate  # Windows
    
    pip install -r requirements-dev.txt
    pytest
    flake8

Jeśli projekt używa Dockera, proces może sprowadzić się do dwóch–trzech komend typu docker-compose up i docker-compose run tests. Nie zgaduj – trzymając się dokumentacji, szybciej dojdziesz do działającego setupu niż eksperymentując na ślepo.

Dłoń wypełniająca formularz zgłoszeniowy długopisem
Źródło: Pexels | Autor: Kindel Media

Czytanie kodu i dokumentacji: jak ogarnąć obcy projekt

Najczęstszy błąd przy pierwszym PR-ze to wskoczenie w edycję pliku, który akurat „wypluło” wyszukiwanie. Kilkanaście minut spędzonych na zrozumieniu struktury projektu zwykle oszczędza godziny przepisywania kodu po review.

Mapa projektu: szybkie rozpoznanie terenu

Zamiast czytać wszystko od deski do deski, zbuduj sobie mapę:

  • Przejrzyj README i sekcje „Architecture” / „Overview”, jeśli istnieją.
  • Spójrz na strukturę katalogów – co jest w src, lib, app, gdzie leżą testy.
  • Zidentyfikuj punkt wejścia aplikacji: pliki typu main.py, index.js, app.tsx.

Dla konkretnego issue nie potrzebujesz rozumieć całego systemu. Wystarczy fragment, w którym zmiana faktycznie zajdzie, i jego najbliższe zależności.

Szukanie miejsca zmiany: od issue do linii kodu

Żeby znaleźć odpowiedni fragment kodu, użyj kombinacji kilku technik:

  • Szukaj po tekście – komunikaty błędów, teksty na UI, nazwy endpointów często są bezpośrednio w kodzie:
    rg "Invalid email" .
    # albo
    grep -R "Invalid email" .
  • Śledź flow od warstwy zewnętrznej – np. od kontrolera HTTP do serwisu i repozytorium.
  • Zobacz, jak testy nazywają rzeczy – testy często mają bardziej czytelne nazwy metod niż produkcyjny kod.

Jeśli issue dotyczy np. błędnej walidacji formularza, zacznij od komponentu UI lub endpointu, który ten formularz obsługuje. Potem schodź w dół, aż do logiki, którą trzeba skorygować.

Wykorzystanie istniejących testów i przykładów

Dobry skrót do zrozumienia projektu to testy. Pokazują, jak autorzy chcą używać funkcji i modułów.

Praktyczna sekwencja:

  1. Znajdź testy związane z obszarem, który dotykasz (np. test_auth.py, user_controller.test.ts).
  2. Przeczytaj kilka najprostszych przypadków testowych – zobaczysz, jakie są zależności i jakie wejścia/wyjścia są normalne.
  3. Uruchom tylko tę grupę testów, zamiast całej bazy:
    pytest tests/test_auth.py
    # lub
    npm test -- --runTestsByPath auth.test.ts

Dzięki temu dużo szybciej zrozumiesz kontekst niż próbując przeglądać wszystkie moduły po kolei.

Kiedy zadać pytanie zamiast kopać dalej

Jeśli po 30–40 minutach nadal nie rozumiesz, gdzie najlepiej wprowadzić zmianę, przerwij. Lepiej napisać krótki komentarz w issue niż przypadkowo rozwalić architekturę.

Przydatny schemat pytania:

I've been looking into this issue and found the following related code:

- `src/auth/validators.py` - handles email validation
- `src/auth/forms.py` - builds the signup form

Would you prefer:
A) Adjusting validation in `validators.py`, or
B) Adding an extra check in the form layer?

I'm leaning towards A) to keep the logic in one place.

Taka wiadomość pokazuje, że wykonałeś pracę domową i potrzebujesz tylko ukierunkowania, a nie gotowego rozwiązania.

Implementacja zmian krok po kroku: od pierwszej linii do gotowego brancha

Gdy wiesz, gdzie pracować, czas wprowadzić zmianę. Dobrze prowadzony branch to seria małych, zrozumiałych kroków, a nie jeden gigantyczny commit „fix everything”.

Plan techniczny „na serwetce”

Zanim dotkniesz klawiatury, rozpisz zmiany w 3–5 punktach. Taki mini-plan:

  • co dokładnie zmieniasz,
  • jakie pliki dotkniesz,
  • jakie testy trzeba dopisać lub zaktualizować.

Przykład:

  • Dodać walidację pustego pola „company” w SignupForm.
  • Zaktualizować test_signup_requires_company w test_signup.py.
  • Dodać komunikat błędu do pliku tłumaczeń.

Plan możesz nawet wkleić w opis PR później jako sekcję „Plan/Steps”.

Małe, logiczne commity zamiast jednego molocha

Dobry commit to:

  • spójna zmiana (np. „dodanie walidacji” albo „aktualizacja testów”),
  • krótki, konkretny opis w trybie rozkazującym (np. fix: validate company field in signup form).

Przykładowy workflow przy małej zmianie:

  1. Edytujesz kod produkcyjny.
  2. Uruchamiasz testy lokalne dla tego modułu.
  3. Commit:
    git add src/auth/forms.py
    git commit -m "fix: require company field in signup form"
  4. Aktualizujesz/dopisujesz testy.
  5. Commit:
    git add tests/test_signup.py
    git commit -m "test: cover missing company field on signup"

Maintainer widzi wtedy osobno, co zmieniło zachowanie, a co tylko urealniło testy.

Testy i lint: lokalna checklista przed pierwszym pushem

Przed git push zrób sobie lokalny „mini CI”. Z listy z contributing guide zbuduj sekwencję, której trzymasz się przed każdym PR-em:

# przykładowo
npm run lint
npm test

# lub
pytest
black .
flake8

Jeśli projekt ma skonfigurowany pre-commit, zainstaluj go zgodnie z instrukcją. Pozwoli automatycznie poprawiać formatowanie i łapać część błędów zanim commit w ogóle powstanie.

Aktualizacja brancha z głównym repozytorium

Gdy pracujesz nad issue dłużej niż dzień–dwa, w międzyczasie mogą wejść inne zmiany. Zanim wyślesz PR, zaktualizuj swój branch:

git checkout main
git pull upstream main
git checkout feature/123-add-validation-to-signup
git merge main
# rozwiąż ewentualne konflikty
git push origin feature/123-add-validation-to-signup

Niektóre projekty wolą rebase zamiast merge, co zwykle jest opisane w contributing guide. Jeśli widzisz tam instrukcję „keep a linear history”, zastąp merge poleceniem:

git fetch upstream
git rebase upstream/main
Dziecko w czerwonej bluzie trafia strzałą w tarczę na dworze
Źródło: Pexels | Autor: RDNE Stock project

Tworzenie pull requesta: jak opisać zmianę, żeby dostać rzeczowy review

Sam kod to tylko połowa pierwszego PR-a. Druga to kontekst, który pomagasz zrozumieć recenzentowi. Dobry opis przyspiesza merge bardziej niż „sprytny” trik w implementacji.

Push brancha i otwarcie PR-a

Gdy lokalne testy przechodzą, a branch jest aktualny, wypchnij go na swojego forka:

git push origin feature/123-add-validation-to-signup

Następnie na GitHubie pojawi się baner „Compare & pull request”. Upewnij się, że:

  • base repo – to oryginalny projekt,
  • base branch – zwykle main lub develop, zgodnie z contributing guide,
  • head repo – twój fork,
  • compare branch – branch z twoją zmianą.

Dobry tytuł PR: prosty, ale informacyjny

Tytuł ma pomóc osobie przeglądającej dziesiątki PR-ów dziennie. Unikaj ogólników typu „Small fixes” czy „Update stuff”. Lepiej:

  • Fix missing company validation in signup form (#123)
  • Add docs for local development with Docker (#456)
  • Prevent crash when dashboard has no widgets (#789)

Jeśli projekt używa konkretnego formatu (np. feat:, fix:), dopasuj się do niego. Często jest on opisany w contributing guide lub szablonie PR.

Struktura opisu PR: prosty szablon, który można powtarzać

Nawet jeśli repo ma własny template, możesz trzymać się stałego układu, który wypełniasz przy każdym PR-ze. Przykładowy schemat:

## Cel

Krótko: co to naprawia/dodaje i dlaczego.

## Zmiany

- Punkt 1
- Punkt 2
- Punkt 3

## Jak to przetestować

- Krok 1
- Krok 2
- Oczekiwany rezultat

## Powiązane issue

Closes #123

Przykład wypełnionego opisu:

Przykład opisu PR w praktyce

## Cel

Naprawa braku walidacji pola "company" przy rejestracji. Obecnie formularz pozwala
na utworzenie konta bez tej informacji, co jest niezgodne z wymaganiami biznesowymi.

## Zmiany

- Dodano walidację pola "company" w `SignupForm`
- Zaktualizowano testy `test_signup_requires_company`
- Dodano komunikat błędu do pliku tłumaczeń `pl.json` i `en.json`

## Jak to przetestować

1. Uruchomić aplikację lokalnie.
2. Przejść do formularza rejestracji.
3. Spróbować zarejestrować się z pustym polem "company".
4. Oczekiwane: formularz pokazuje komunikat błędu, konto nie zostaje utworzone.

## Powiązane issue

Closes #123

Taki opis pozwala recenzentowi w kilka sekund zrozumieć kontekst i odtworzyć scenariusz.

Linkowanie issue, tasków i kontekstu biznesowego

Jeśli PR rozwiązuje konkretne issue, użyj słów kluczowych rozpoznawanych przez GitHuba:

  • Closes #123
  • Fixes #123
  • Resolves #123

Dzięki temu po mergu issue zamknie się automatycznie. Gdy zmiana jest częścią większego zadania (np. z Jiry lub Trello), wklej też link w sekcji „Powiązane”. Pozwala to osobom spoza GitHuba złapać pełny obraz.

Checklisty i self‑review przed wysłaniem

Zanim klikniesz „Create pull request”, zrób krótkie self-review. Możesz trzymać sobie taką mini-checklistę w notatkach:

  • Opisuje, co zmienia PR i dlaczego.
  • Ma link do issue lub zadania.
  • Opisuje, jak przetestować zmianę ręcznie.
  • Wspomina o efektach ubocznych (np. migracje bazy, zmiany API).

Dobry trik: jeszcze przed wysłaniem PR-a otwórz zakładkę „Files changed” i przeczytaj własne zmiany jak recenzent. Często wyłapiesz oczywiste literówki, komentarze debuggingowe czy martwy kod, zanim ktoś inny je zobaczy.

Screeny, gif-y i logi, gdy dotykasz UI lub błędów

Przy PR-ach związanych z UI lub błędami runtime kilka obrazków oszczędza długich dyskusji:

  • zrzut ekranu „przed” i „po” przy zmianie interfejsu,
  • krótki gif pokazujący nowy flow,
  • fragment logów przed naprawą i po niej, jeśli błąd dotyczył wyjątków.

Najprościej wrzucić pliki bezpośrednio w treść PR-a metodą „przeciągnij i upuść”. Recenzent od razu widzi efekt, nie musi wstawać całego środowiska, żeby złapać sens.

Flagi typu „draft”, „WIP” i kiedy ich używać

Jeśli chcesz feedbacku, ale praca nie jest gotowa do merge, użyj opcji „Draft pull request”. Sygnalizujesz wtedy, że:

  • architektura lub kierunek są do omówienia,
  • część testów jeszcze nie istnieje lub nie przechodzi,
  • zmiana może się istotnie zmienić w trakcie rozmowy.

Na początku kontrybucji bywa to wygodne: pokazujesz kod szybciej i minimalizujesz ryzyko, że pójdziesz w ślepy zaułek.

Jak reagować na szablony PR i automatyczne checki

Wiele projektów korzysta z szablonów PR (templates) i botów. Jeśli przy tworzeniu PR-a pojawia się gotowy tekst z checkboxami i pytaniami – wypełnij go, zamiast usuwać:

  • odznacz pola typu „[x] I added tests for my changes”, jeśli rzeczywiście dodałeś testy,
  • uzupełnij sekcje „Breaking changes”, „Screenshots”, choćby krótkim „None” zamiast zostawiać puste nagłówki.

Boty CI zwykle uruchamiają lint, testy i ewentualnie budowanie paczek. Gdy jakiś check świeci na czerwono, kliknij w szczegóły, zobacz logi i popraw błąd lokalnie. Jedno-dwa nieudane buildy przy pierwszym PR-ze to normalna rzecz – ważne, byś pokazał, że aktywnie reagujesz.

Komunikacja po wysłaniu PR: komentarze, pingowanie, poprawki

Pull request to początek rozmowy, a nie jednostronne ogłoszenie. Warto mieć prostą strategię:

  • Gdy dostajesz komentarz – odpowiedz na niego, nawet jeśli tylko „Done, thanks!” i popraw kod.
  • Jeśli nie rozumiesz uwagi – dopytaj konkretnie, najlepiej pod konkretną linią.
  • Jeśli nie zgadzasz się z sugestią – wyjaśnij, dlaczego; zaproponuj alternatywę.

Po wprowadzeniu poprawek dopisz krótką aktualizację w PR-ze. Np.:

Updates:
- Applied suggested naming for `validate_company`
- Added missing test for empty string case
- Rebased on latest `main`

Recenzent widzi wtedy, co się zmieniło bez ponownego analizowania całej historii.

Jak czytać uwagi do kodu bez spinania się

Komentarze przy PR-ach często dotyczą stylu, konwencji, czasem drobnych detali typu nazwa zmiennej. Nie świadczą o tym, że „kod jest zły”, tylko że projekt ma swoje przyzwyczajenia. Dobrze jest sobie ustawić kilka prostych zasad mentalnych:

  • nie traktować uwag personalnie – recenzja jest o kodzie, nie o tobie,
  • patrzeć na powtarzające się wzorce – jeśli kilka razy ktoś wspomina o stylu testów, zanotuj sobie ten styl na później,
  • pytanie „czy w tym projekcie preferujemy X czy Y?” jest zawsze w porządku.

Po dwóch–trzech PR-ach zaczniesz naturalnie trafiać w lokalne standardy i komentarzy będzie mniej.

Aktualizowanie PR-a: dopisywanie commitów vs. squash

Podczas poprawek zwykle dopiszesz kilka dodatkowych commitów. Standardowy przepływ wygląda tak:

# wprowadzasz poprawki po review
git add .
git commit -m "fix: address review comments"
git push origin feature/123-add-validation-to-signup

Większość projektów akceptuje taką historię, a przy mergu używa „Squash and merge”, łącząc wszystko w jeden commit. Jeśli maintainter poprosi o wyczyszczenie historii, możesz użyć interaktywnego rebase:

git rebase -i upstream/main

i połączyć „drobne” commity w większe logiczne bloki. Zanim to zrobisz, upewnij się, że rozumiesz konsekwencje przepisywania historii (szczególnie gdy nad gałęzią pracuje kilka osób).

Co zrobić, gdy PR długo czeka na review

Zdarza się, że maintainerzy mają mało czasu i PR-y leżą tydzień czy dwa. Zamiast frustrować się w ciszy, lepiej delikatnie przypomnieć o sobie:

  • po 5–7 dniach możesz napisać uprzejmy komentarz w stylu:
    Hi, just a gentle ping on this PR.
    Happy to adjust the implementation if needed.
  • jeśli projekt ma kanał na Slacku/Discordzie, zapytaj tam, czy ktoś mógłby rzucić okiem,
  • jeśli maintainterzy wyraźnie piszą, że potrzebują więcej czasu – uszanuj to, nie spamuj co dzień.

Dla siebie możesz założyć prostą zasadę: równolegle szukasz innego drobnego issue w tym lub innym projekcie, żeby nie blokować nauki na jednym PR-ze.

Kiedy zamknąć PR samodzielnie

Czasem w trakcie review wychodzi, że podejście było chybione albo projekt zmienił kierunek. Zamiast ciągnąć temat miesiącami, rozsądnie bywa PR zamknąć własnoręcznie:

  • gdy maintainerzy wyraźnie piszą: „idziemy inną drogą, nie będziemy tego mergować”,
  • gdy sam uznasz, że architektura zmiany jest nie do uratowania i łatwiej zacząć od nowa,
  • gdy issue, które rozwiązywałeś, jest już zamknięte przez kogoś innego inną zmianą.

Możesz wtedy dopisać w komentarzu krótkie wyjaśnienie i podziękować za feedback. Nauka z tego PR-a zostaje z tobą, nawet jeśli kod nie trafił do maina.

Jak wyciągnąć maksimum z feedbacku z pierwszego PR-a

Pierwszy PR to kopalnia wiedzy o stylu projektu. Dobry nawyk po merge (lub zamknięciu) to szybka retrospektywa, choćby w notatniku:

  • Jakie uwagi powtarzały się najczęściej? (naming, testy, struktura plików?)
  • Co mogłem zrobić lepiej przed wysłaniem? (lepsze testy jednostkowe, dokładniejsze czytanie contributing guide?)
  • Jakie komendy, skróty, skrypty były nowe i przydatne?

Takie 5–10 minut po każdym PR-ze szybko buduje intuicję. Przy trzecim–czwartym wkładzie do tego samego projektu wchodzisz już w rytm „prawie jak członek zespołu”, a maintainterzy wiedzą, czego się po twoich zmianach spodziewać.

Rozsądne skalowanie: od „good first issue” do trudniejszych tematów

Gdy pierwszy PR przejdzie, kusi, żeby od razu brać się za duże refaktory czy kluczowe moduły. Lepiej zwiększać poziom trudności stopniowo. Przykładowa ścieżka:

  1. 1–2 małe bugfixy typu „good first issue”.
  2. Kilka prostych usprawnień: poprawki dokumentacji, testów, małych fragmentów logiki.
  3. Zmiana obejmująca kilka plików, np. nowy endpoint lub funkcja.
  4. Mała refaktoryzacja istniejącego modułu, zaproponowana po konsultacji z maintainerem.

Przy większych tematach warto zacząć od komentarza w issue: opisać plan, poprosić o potwierdzenie kierunku i dopiero wtedy pisać kod. Zmniejsza to szansę, że spędzisz weekend na implementacji, która i tak nie wejdzie.

Budowanie relacji z projektem i zespołem

Kontrybucja to nie tylko linie kodu. Z czasem, jeśli regularnie dostarczasz PR-y, możesz:

  • pomagać innym w issue i odpowiadać na proste pytania,
  • proponować usprawnienia dokumentacji, gdy sam się na czymś wywrócisz,
  • zgłaszać sensowne bugi wraz z minimalnymi przykładami reprodukcji.

Tak buduje się zaufanie. Na tym etapie maintainterzy czasem sami oznaczają cię w nowych issue („może będziesz zainteresowany?”), a w skrajnym przypadku zaproszą do zespołu z prawami zapisu do repo. Wszystko zaczyna się od pierwszego, solidnie przygotowanego pull requesta.

Bibliografia i źródła

  • Producing Open Source Software: How to Run a Successful Free Software Project. O’Reilly Media (2020) – Praktyki współpracy, role maintainerów, proces przyjmowania kontrybucji
  • Forge Your Future with Open Source. Pragmatic Bookshelf (2018) – Jak znaleźć projekt, przygotować pierwsze kontrybucje i PR w open source
  • Open Source Guides: How to Contribute to Open Source. GitHub (2023) – Oficjalne wytyczne GitHub dotyczące pierwszych kontrybucji i pull requestów
  • Git Documentation: Branching and Merging. Software Freedom Conservancy – Oficjalna dokumentacja gita o pracy na branchach i integracji zmian