5. témakör · Csapatmunka GitHubon · 20. fejezet
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.
main frissítése, git fetch --prune.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:
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.
git switch main, git pull, git switch -c feature/galeria.git push -u origin feature/galeria.| Állapot | Jelentése |
|---|---|
| Open | nyitott, átnézhető, beolvasztható |
| Draft | piszkozat: a munka még folyik, visszajelzést kérsz, de még nem olvasztható be (Ready for review gombbal lesz nyitott) |
| Merged | beolvasztva: a változás a cél ágban van |
| Closed | lezárva beolvasztás nélkül (pl. elvetett ötlet); a Reopen gombbal újranyitható |
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:
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).
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.
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.
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ím | Jó cím |
|---|---|
| javítás | fix: a menü mobilon is lenyílik |
| Update index.html | feat: galéria oldal a kirándulás képeivel |
| Péter kérése | docs: telepítési lépések a README-ben |
Closes #7, Fixes #7 vagy Resolves #7,
akkor a PR beolvasztásakor a GitHub automatikusan lezárja a 7-es issue-t (23. fejezet).@toth-peter értesítést küld Péternek..github/pull_request_template.md, minden új PR leírása ezzel töltődik ki.| Fül | Mit látsz rajta? |
|---|---|
| Conversation | a leírás, a hozzászólások, a review-k, az események (új commitok, címkék, merge), alul a merge-doboz |
| Commits | az ág commitjai, amelyek még nincsenek a base ágban |
| Files changed | a 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:
| Üzenet | Mit jelent, mi a teendő? |
|---|---|
| ✓ This branch has no conflicts with the base branch | beolvasztható |
| ✗ 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 branch | a main azóta előrement: Update branch (ha a szabály megköveteli, hogy friss legyen) |
| ● Review required | jóváhagyás kell (védett ág, 24. fejezet) |
| ✗ Changes requested | a bíráló változtatást kért: javítsd, töltsd fel, kérj új átnézést |
| ✗ Some checks were not successful | egy automatikus ellenőrzés elbukott (27. fejezet) |
| ✗ Merging is blocked | valamelyik szabály még nem teljesül; a gomb addig szürke |
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!
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 commit | Squash and merge | Rebase 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ással | az ág commitjai egyenként, új hash-sel, merge commit nélkül |
| Történet | teljes, az elágazás látszik | tiszta: egy PR = egy commit | egyenes, a részletek megmaradnak |
| Hátrány | zsúfolt gráf sok kis commitnál | a 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énet | sok apró „javítás” commit; tiszta main-t szeretnétek | gondosan szétválasztott, önálló commitok |
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.
Melyik merge-mód illik a helyzethez?
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 (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.)
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.
git push — a PR magától frissül, a Conversation fülön megjelenik:
added 1 commit. Nem kell új PR.git pull az ágon, hogy nálad is meglegyen.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.
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).
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!
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
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.
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.
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.
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?
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?
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.
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.
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.
| Fogalom | Jelenté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 PR | piszkozat PR: látható és véleményezhető, de nem olvasztható be (Ready for review) |
| Conversation / Commits / Files changed | a 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 merge | a PR összes változása egyetlen új commitként kerül a main-re |
| rebase and merge | a PR commitjai egyenként, új hash-sel kerülnek a main végére, merge commit nélkül |
| Update branch | a base ág behúzása a PR ágába (merge committal) |
| Delete branch / Restore branch | a PR ágának törlése a GitHubon merge után / visszaállítása |
git fetch --prune | a 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 |
Closes #n.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.