Vezérlőpult
20. Pull request · Csapatmunka GitHubon

5. témakör · Csapatmunka GitHubon · 20. fejezet

Pull request

Eddig te magad olvasztottad be az ágaidat a gépeden. Csapatban ez másképp megy: feltöltöd az ágat, és a GitHubon egy pull requestben kéred, hogy beolvadjon a main-be. A PR-ban látszik minden változás, a többiek hozzászólnak, jóváhagynak, és a végén egy gombnyomás a merge. Ebben a fejezetben végigviszel egy PR-t az ág létrehozásától a rendrakásig.

Web + DesktopPR-laborMerge-mód-összehasonlítóBesoroló16 kvízkérdés

Tanulási célok

1Mi a pull request?

A pull request (röviden PR) egy kérés: „kérlek, olvaszd be az ágamat a main-be”. Nem a Git része, hanem a GitHubé (a GitLabon merge request a neve, a lényeg ugyanaz). A PR egy weboldal, amely az ágad és a cél ág különbségéről szól:

feature ágcommitok a gépeden
git pushaz ág a GitHubra kerül
pull request„olvaszd be, kérlek”
reviewmegjegyzés, javaslat, jóváhagyás
mergea változás a main-be kerül
ℹ️ MIÉRT NEM OLVASZTUNK EGYSZERŰEN A GÉPEN?

Megtehetnéd: git switch main, git merge feature, git push. Csapatban mégis a PR a szokás, mert így más is átnézi a változást, mielőtt a közös ágra kerül, és a main védhető: beállítható, hogy oda csak jóváhagyott PR-on keresztül kerülhessen bármi (24. fejezet). A „pull” szó onnan jön, hogy a repó gazdáját kéred: húzza be a változásaidat.

2A PR életútja

  1. Ág a friss main-ből: git switch main, git pull, git switch -c feature/galeria.
  2. Commitok az ágon (kicsik, jó üzenettel, 7. fejezet).
  3. Feltöltés: git push -u origin feature/galeria.
  4. PR megnyitása a GitHubon: cím, leírás, bírálók.
  5. Review: megjegyzések; ha kell, újabb commitok ugyanarra az ágra, majd push — a PR magától frissül.
  6. Merge a GitHubon (a három mód egyikével).
  7. Rendrakás: ág törlése a GitHubon és a gépeden, a helyi main frissítése.
ÁllapotJelentése
Opennyitott, átnézhető, beolvasztható
Draftpiszkozat: a munka még folyik, visszajelzést kérsz, de még nem olvasztható be (Ready for review gombbal lesz nyitott)
Mergedbeolvasztva: a változás a cél ágban van
Closedlezárva beolvasztás nélkül (pl. elvetett ötlet); a Reopen gombbal újranyitható

3PR megnyitása

PS> git push -u origin feature/galeria
remote:
remote: Create a pull request for 'feature/galeria' on GitHub by visiting:
remote:      https://github.com/anna-kovacs/osztalyoldal/pull/new/feature/galeria
remote:
To https://github.com/anna-kovacs/osztalyoldal.git
 * [new branch]      feature/galeria -> feature/galeria

Egy PR-t háromféleképpen kezdhetsz el:

base: maincompare: feature/galeria

A base a cél ág (ahová a változás kerül, általában a main), a compare (más néven head) a te ágad. A nyíl a beolvasztás irányát mutatja. Alatta a GitHub rögtön jelzi, hogy összeolvasztható-e: Able to merge (nincs ütközés) vagy Can’t automatically merge — ez utóbbi esetén is megnyithatod a PR-t, az ütközést később oldod fel (8. szakasz).

💡 DRAFT PULL REQUEST

A zöld gomb melletti nyíllal Create draft pull request is választható. Akkor jó, ha korán szeretnél visszajelzést egy félkész munkára: a piszkozatot mindenki látja, hozzászólhat, de beolvasztani nem lehet. Ha elkészültél: Ready for review.

⚠️ EGY PR = EGY TÉMA

A kis PR-t gyorsan és alaposan át lehet nézni, a 40 fájlos „minden egyben” PR-t senki sem nézi át rendesen. Ha közben egy másik hibát is észreveszel, arra nyiss külön ágat és külön PR-t.

4Jó cím, jó leírás

A PR címe és leírása a bírálónak szól: mit változtattál, miért, és hogyan ellenőrizheti. Egy bevált szerkezet (a leírás Markdown, 5. fejezet):

## Mit változtat?
Galéria oldal az osztálykirándulás képeivel.

## Miért?
A szülők kérték, hogy egy helyen lássák a képeket.

## Hogyan ellenőrizd?
- Nyisd meg a galeria.html-t
- Minden kép alatt legyen felirat

Closes #7
Gyenge címJó cím
javításfix: a menü mobilon is lenyílik
Update index.htmlfeat: galéria oldal a kirándulás képeivel
Péter kérésedocs: telepítési lépések a README-ben

5A PR oldala

FülMit látsz rajta?
Conversationa leírás, a hozzászólások, a review-k, az események (új commitok, címkék, merge), alul a merge-doboz
Commitsaz ág commitjai, amelyek még nincsenek a base ágban
Files changeda teljes diff fájlonként; itt írhatsz soros megjegyzést és javaslatot (21. fejezet)

A merge-doboz üzenetei megmondják, mehet-e a beolvasztás:

ÜzenetMit jelent, mi a teendő?
✓ This branch has no conflicts with the base branchbeolvasztható
✗ This branch has conflicts that must be resolvedütközés: feloldás a gépeden vagy a webes Resolve conflicts szerkesztőben (8. szakasz)
● This branch is out-of-date with the base brancha main azóta előrement: Update branch (ha a szabály megköveteli, hogy friss legyen)
● Review requiredjóváhagyás kell (védett ág, 24. fejezet)
✗ Changes requesteda bíráló változtatást kért: javítsd, töltsd fel, kérj új átnézést
✗ Some checks were not successfulegy automatikus ellenőrzés elbukott (27. fejezet)
✗ Merging is blockedvalamelyik szabály még nem teljesül; a gomb addig szürke

6Három merge-mód

A zöld merge-gomb melletti nyíllal háromféle beolvasztás közül választhatsz. Mindhárom után ugyanazok a fájlok lesznek a main-en — a különbség a történetben van. Nézd meg ugyanazt a PR-t háromféleképpen beolvasztva!

Merge-mód-összehasonlító

A feature/galeria ág három commitja (Galéria váz, Képek, Feliratok) a main-be kerül. Válassz módot!

Előtte

Utána

Create a merge commitSquash and mergeRebase and merge
Mi kerül a main-re?az ág összes commitja + egy merge commit (két szülő)egyetlen új commit az összes változássalaz ág commitjai egyenként, új hash-sel, merge commit nélkül
Történetteljes, az elágazás látsziktiszta: egy PR = egy commitegyenes, a részletek megmaradnak
Hátrányzsúfolt gráf sok kis commitnála részletes commitok nem kerülnek a main-reúj hash-ek; a PR határa nem látszik a gráfon
Mikor?nagy, hosszú életű ágak; ha fontos a pontos történetsok apró „javítás” commit; tiszta main-t szeretnétekgondosan szétválasztott, önálló commitok
ℹ️ A CSAPAT DÖNT

A repó gazdája a Settings → General → Pull Requests részen állítja be, melyik mód legyen engedélyezve (Allow merge commits, Allow squash merging, Allow rebase merging). Sok csapat csak egyet enged, hogy a történet egységes legyen.

Merge commit, squash vagy rebase?

Melyik merge-mód illik a helyzethez?

1 / 8Pontszám: 0
…

7Merge után: rendrakás

A beolvasztás után a PR alján megjelenik: Pull request successfully merged and closed és egy Delete branch gomb. Az ág elvégezte a dolgát, nyugodtan törölheted (ha tévedtél, a Restore branch visszahozza). A repó beállításaiban az Automatically delete head branches ezt magától elvégzi.

A gépeden még minden a régi: a main nem tud a merge-ről, a feature ág és az origin/feature/galeria is megvan. A rendrakás:

PS> git switch main
PS> git pull                          # lejön a merge (vagy a squash) commit
PS> git branch -d feature/galeria     # a helyi ág törlése
PS> git fetch --prune                 # a GitHubon törölt ágak origin/… másolatai is eltűnnek
 - [deleted]         (none)     -> origin/feature/galeria
⚠️ SQUASH UTÁN: „NOT FULLY MERGED”

Squash (vagy rebase) után a helyi ágad commitjai nincsenek benne a main-ben: a GitHub új commito(ka)t készített helyettük. Ezért a git branch -d ilyenkor tiltakozhat: error: the branch 'feature/galeria' is not fully merged. Ha a PR biztosan beolvadt, a git branch -D feature/galeria biztonságos. (Amíg az origin/feature/galeria még megvan nálad, a Git ahhoz méri, és csak figyelmeztet.)

💡 AUTOMATIKUS PRUNE

A git config --global fetch.prune true után minden fetch és pull magától eltakarítja a GitHubon már nem létező ágak másolatait.

8A PR frissítése és az ütközés

Ha a PR ütközik a main-nel (This branch has conflicts that must be resolved), a legbiztosabb a feloldás a gépeden, a 13. fejezet módszerével:

PS> git switch feature/galeria
PS> git fetch
PS> git merge origin/main             # a friss main beolvasztása az ágadba
CONFLICT (content): Merge conflict in index.html
# … feloldás a fájlban …
PS> git add index.html
PS> git commit --no-edit
PS> git push                          # a PR ütközése eltűnik

Egyszerű, néhány soros ütközésnél a PR oldalán a Resolve conflicts gomb egy webes szerkesztőt nyit: a jelölőket (<<<<<<<, =======, >>>>>>>) kitörlöd, és a Commit merge ugyanezt a merge commitot készíti el a GitHubon.

⛔ PR-ÜTKÖZÉSRE NEM A FORCE PUSH A VÁLASZ

Az ütközést az ágadon oldod fel, és sima push-sal töltöd fel. A main-hez nem nyúlsz, force push-ra nincs szükség (19. fejezet).

9PR a Desktopban és a VS Code-ban

Desktop GitHub Desktop
  • Az ág feltöltése (Publish branch, majd Push origin) után a középső panelen megjelenik a Create Pull Request gomb (menüből: Branch → Create Pull Request, Ctrl + R). A PR a böngészőben nyílik meg, a base és a compare már ki van töltve.
  • A Preview Pull Request a Desktopban mutatja meg előre a PR diffjét.
  • A Current branch lenyíló Pull requests fülén a repó nyitott PR-jai látszanak; egyre kattintva a Desktop átvált a PR ágára (így kipróbálhatod a gépeden).
  • Merge után: Current branch → main, Fetch origin / Pull origin, és a régi ágat jobb gombbal törölheted (Delete…).
IDE VS Code
  • A GitHub Pull Requests bővítmény (a GitHub hivatalos bővítménye) után a bal oldali sávban megjelenik a PR-ok nézete: PR létrehozása, a diff és a megjegyzések megtekintése, Checkout és akár merge is, az editor elhagyása nélkül.
  • A Publish Branch után a VS Code is felajánlja: Create Pull Request.
  • A Visual Studio a Git Changes ablakban push után ad Create a Pull Request linket (25. fejezet).

10PR-labor

Az osztalyoldal repón Péterrel dolgoztok. Készíts egy galéria oldalt egy külön ágon, nyiss róla PR-t, válaszolj Péter review-jára, olvaszd be, és rakj rendet. A terminál a géped, alatta a böngésződ a GitHubbal: ott kattintgass!

PowerShell + Git + GitHub

Windows PowerShell
Küldetések 0 / 8
    A gépeden
    A GitHubonanna-kovacs/osztalyoldal

    11Feladatok

    Gyakorló feladatok

    ⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

    20.1⭐Web

    Egy saját repódban szerkeszd a README-t a GitHub weboldalán, de a mentésnél válaszd a Create a new branch for this commit and start a pull request lehetőséget. Nyisd meg a PR-t, majd olvaszd be.

    20.2⭐CLIWeb

    A gépeden: git switch -c, egy commit, git push -u origin …. Nyisd meg a push kimenetében lévő linket, és nyiss PR-t a fejezet leírás-sablonja szerint.

    20.3⭐Desktop

    A GitHub Desktopban hozz létre egy ágat, commitolj, Publish branch, majd nézd meg a Preview Pull Request ablakot, és nyisd meg a PR-t a Create Pull Request gombbal.

    20.4⭐⭐WebCLI

    Egy gyakorló repóban nyiss három, egyenként két-három commitos PR-t, és olvaszd be őket a három különböző módszerrel. A gépeden git pull után hasonlítsd össze a git log --oneline --graph kimenetét: melyik PR hol és hogyan látszik?

    20.5⭐⭐CLI

    Egy squash-merge után futtasd a git fetch --prune, majd próbáld a helyi ágat git branch -d-vel törölni. Mit ír a Git, és miért? Mi a megoldás?

    20.6⭐⭐Web

    Készíts PR-sablont: .github/pull_request_template.md (Mit? Miért? Hogyan ellenőrizd?). Nyiss egy új PR-t, és nézd meg, kitöltődik-e a leírás.

    20.7⭐⭐⭐CLIWeb

    Idézz elő PR-ütközést: a main-en és a feature ágon is módosítsd ugyanazt a sort. Oldd fel egyszer a gépeden (git merge origin/main, feloldás, push), egyszer (egy másik PR-ban) a webes Resolve conflicts szerkesztővel. Hasonlítsd össze a keletkezett merge commitokat.

    12Önellenőrző kvíz

    Ellenőrizd magad!

    Az egyválasztós kérdéseknél kattints a válaszra. A többválasztósaknál jelöld be az összes helyeset, majd nyomd meg az Ellenőrzés gombot.

    13Fogalomtár

    FogalomJelentés
    pull request (PR)kérés a GitHubon egy ág beolvasztására egy másikba, a változások megbeszélésével
    base / compare (head)a cél ág, ahová a változás kerül / a forrás ág, ahonnan jön
    draft PRpiszkozat PR: látható és véleményezhető, de nem olvasztható be (Ready for review)
    Conversation / Commits / Files changeda PR oldalának fülei: beszélgetés és merge-doboz / a commitok / a diff
    merge commit (Create a merge commit)az ág commitjai + egy kétszülős merge commit kerül a main-re
    squash and mergea PR összes változása egyetlen új commitként kerül a main-re
    rebase and mergea PR commitjai egyenként, új hash-sel kerülnek a main végére, merge commit nélkül
    Update brancha base ág behúzása a PR ágába (merge committal)
    Delete branch / Restore brancha PR ágának törlése a GitHubon merge után / visszaállítása
    git fetch --prunea GitHubon már nem létező ágak origin/… másolatainak törlése
    záró kulcsszóCloses #7, Fixes #7, Resolves #7: merge után lezárja az issue-t

    14Összegzés

    1. A pull request kérés egy ág beolvasztására; a GitHubon látszik a diff, lehet róla beszélgetni, és ellenőrzések futhatnak rajta.
    2. Megnyitása: push után a Compare & pull request sáv vagy a push-link; base ← compare. Jó cím, leírás (Mit? Miért? Hogyan ellenőrizd?), szükség esetén Closes #n.
    3. A PR ugyanarra az ágra érkező új commitokkal magától frissül; ütközésnél a main-t az ágadba olvasztod, feloldod és feltöltöd.
    4. Merge commit: teljes történet; squash: egy PR = egy commit; rebase: egyenes történet új hash-ekkel.
    5. Merge után: Delete branch, a gépeden git switch main, git pull, git branch -d (squash után -D), git fetch --prune.

    A következő fejezetben a másik oldalra állsz: te nézed át mások PR-jait, soros megjegyzéssel, javaslattal és jóváhagyással.