Vezérlőpult
11. Ágak (branch) és a HEAD · Ágak és összefésülés

3. témakör · Ágak és összefésülés · 11. fejezet

Ágak (branch) és a HEAD

Eddig minden commit egyetlen egyenes vonalra került. A valódi projektekben viszont egyszerre több dolgon dolgozunk: egy új funkción, egy sürgős hibajavításon, egy kísérleten. Erre valók az ágak. Megtanulod, mi az ág valójában (meglepően egyszerű!), mit jelent a HEAD, hogyan hozol létre ágat, és hogyan váltasz közöttük parancssorból és a GitHub Desktopban.

CLI + DesktopÁg-játszótérÉlő commitgráfSzimulátor15 kvízkérdés

Tanulási célok

1Miért kellenek ágak?

Képzeld el: a csapat weboldalán egy új galéria oldalon dolgozol, félkész állapotban. Ekkor kiderül, hogy a kezdőlapon hibás a telefonszám, és azonnal javítani kell. Ha minden egyetlen vonalon történik, a javítással együtt a félkész galéria is „élesbe” kerülne. Ágakkal viszont:

🌿 maina mindig működő, „kiadható” változat
🧪 galeriaaz új funkció, amíg el nem készül; senkit nem zavar
🩹 fix/telefonszama gyors javítás, amely a galériától függetlenül mehet élesbe

2Mi az ág valójában?

Sokan azt hiszik, hogy egy ág létrehozásakor a Git lemásolja a projekt fájljait. Nem így van. Az ág csupán egy név, amely egy commitra mutat, egy mozgatható címke. A .git/refs/heads/ mappában minden ágnak egy kis szövegfájl felel meg, benne egyetlen commit hash-ével:

PS> cat .git\refs\heads\main
a3f1c07d92e4b1c6f0a8e57b3d21c9f4e6a0b8d2
ℹ️ A COMMITOK NEM „TARTOZNAK” EGY ÁGHOZ

A commit nem tárolja, melyik ágon készült. Csak a szülőjét ismeri. Ezért lehet, hogy egy commit egyszerre több ág történetének is része: például a legelső commit minden ághoz hozzátartozik.

4Ág-játszótér

Próbáld ki gombokkal! Commitolj, hozz létre ágat, válts! Figyeld, melyik címke lép tovább commitkor, hová mutat a HEAD, és mi van a .git mappában. Ha egy commitra rákattintasz, a HEAD leválik róla (8. szakasz).

Címkék és a HEAD

Commitgráfkattints egy commitra a leválasztott HEAD-hez
Kiadott parancsok

      
A .git mappában

      

5main vagy master?

Az első ágnak nincs különleges szerepe, a neve is csak megállapodás. A Git hosszú ideig master néven hozta létre, 2020 óta a GitHub az új repóknál a main nevet használja, és ma a legtöbb eszköz is ezt javasolja. Régebbi projektekben és leírásokban ezért még gyakran találkozol a master-rel. A kettő ugyanazt a szerepet tölti be.

# az alapértelmezett név beállítása (2. fejezet)
PS> git config --global init.defaultBranch main

# egy meglévő repó master ágának átnevezése
PS> git branch -m master main
💡 NÉZD MEG, MI A FŐ ÁG NEVE

Mielőtt egy idegen repóban parancsokat gépelsz, a git branch megmutatja, hogy main vagy master a fő ág. Sok hibaüzenet (pathspec 'main' did not match…) abból adódik, hogy a repóban a másik név van használatban.

6Ágak parancssorból

ParancsMit csinál?
git branchkilistázza a helyi ágakat; a * jelöli, hol állsz (-v: az utolsó commit is)
git branch galeriaúj ágat hoz létre a mostani commitnál, de nem vált rá
git switch galeriaátvált egy meglévő ágra
git switch -c galerialétrehozza az ágat, és rögtön át is vált rá (-c = create)
git checkout galeria
git checkout -b galeria
ugyanez a régebbi paranccsal (váltás / létrehozás + váltás)
git switch -vissza az előző ágra
git branch -m régi újátnevez egy ágat (egy névvel: a mostanit)
git branch -d galeriatörli az ágat, ha már be van olvasztva; különben figyelmeztet
git branch -D galeriakényszerített törlés: a be nem olvasztott commitok is elhagyhatók (a reflogból még visszahozhatók)
git log --oneline --graph --allaz összes ág története rajzzal
PS> git switch -c galeria
Switched to a new branch 'galeria'
PS> git branch
* galeria
  main
PS> git log --oneline --graph --all
* 9b2e4f1 (HEAD -> galeria) feat: galéria oldal
| * 5c7d013 (main) fix: telefonszám javítása
|/
* 2f6a9c3 Kezdőlap első változata

A rajzon látszik: a két ág a 2f6a9c3 commitnál elágazott, és azóta mindkettőn készült egy-egy commit. Ezek összefésülése lesz a 12. fejezet témája.

Melyik parancs kell?

Válaszd ki, melyik parancs végzi el a feladatot!

1 / 8Pontszám: 0
…

7Váltás és a munkakönyvtár

Ágváltáskor a Git a munkakönyvtárat a másik ág legutolsó commitjának állapotára hozza: a fájlok tartalma megváltozik, egyes fájlok megjelennek vagy eltűnnek. Ez nem baj: semmi nem veszett el, a fájlok a másik ág commitjaiban vannak. Visszaváltáskor visszakerülnek.

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

A megoldás: commitold a munkát a mostani ágon, dobd el (git restore), vagy tedd félre (git stash, 14. fejezet). A GitHub Desktop ilyenkor megkérdezi, vigye-e magával a módosításokat (Bring my changes) vagy hagyja a régi ágon (Leave my changes, ez a háttérben stash).

💡 VÁLTÁS ELŐTT: GIT STATUS

Jó szokás ágváltás előtt a git status-szal ellenőrizni, hogy tiszta-e a munkakönyvtár (nothing to commit, working tree clean). Így biztosan nem viszel át véletlenül félkész módosítást a másik ágra.

8A leválasztott HEAD

Ha nem ágra, hanem közvetlenül egy commitra váltasz (pl. hogy megnézd, hogyan nézett ki régen a projekt), a HEAD leválik (angolul detached HEAD): nem ágra mutat, hanem egy commitra.

PS> git switch --detach 2f6a9c3       # vagy: git checkout 2f6a9c3
HEAD is now at 2f6a9c3 Kezdőlap első változata
PS> git status
HEAD detached at 2f6a9c3
⚠️ NEM HIBA, CSAK FIGYELMEZTETÉS

A detached HEAD kifejezés ijesztően hangzik, de nem jelent bajt. Csak annyit jelent, hogy most nem ágon dolgozol. Ha véletlenül kerültél bele, egy git switch main visszavisz.

9switch vagy checkout?

A git checkout régen nagyon sokféle dolgot csinált: ágat váltott, ágat hozott létre, commitra ugrott, és egy fájl módosításait is visszaállította. Ez sok félreértést okozott, ezért a Git 2.23-as változata (2019) két új, egyértelmű paranccsal osztotta szét a feladatait:

FeladatRégi alakÚj, ajánlott alak
ágváltásgit checkout galeriagit switch galeria
új ág + váltásgit checkout -b galeriagit switch -c galeria
commitra ugrásgit checkout 2f6a9c3git switch --detach 2f6a9c3
fájl visszaállításagit checkout -- index.htmlgit restore index.html (10. fejezet)

Mindkettő működik, és a régi alakot rengeteg leírásban, tesztben és kollégánál látni fogod, ezért érdemes ismerni. Saját munkához a switch és a restore ajánlott.

10Jó ágnevek

11Ágak a Desktopban és a VS Code-ban

Desktop GitHub Desktop
  • Felül a Current branch gomb mutatja, hol állsz; rákattintva listázza az ágakat, és egy kattintással válthatsz.
  • New branch (vagy Branch → New branch…, Ctrl+Shift+N): megadod a nevet és azt, melyik ágból induljon.
  • Ha nem commitolt módosításod van, váltáskor rákérdez: Leave my changes on … (félreteszi, stash) vagy Bring my changes to … (viszi).
  • Branch → Rename… és Branch → Delete…: átnevezés és törlés. A History fül az aktuális ág commitjait mutatja.
IDE VS Code
  • A bal alsó sarokban (állapotsor) látszik az ág neve. Rákattintva: váltás, Create new branch…, Create new branch from….
  • A Source Control panel … menüjében: Branch → Create / Rename / Delete Branch…
  • A Git Graph bővítmény (25. fejezet) a git log --graph --all-hoz hasonló, kattintható rajzot készít.
Web GitHub.com
  • A repó oldalán a bal felső ágválasztóval nézheted meg bármelyik ág fájljait és commitjait.
  • Ugyanitt új ágat is létrehozhatsz: beírod a nevet → Create branch … from main.
  • A Branches oldalon (…/branches) látszik minden ág, mennyivel jár előrébb vagy hátrébb a fő ághoz képest, és törölhető is.

12Gyakorlás a szimulátorban

A portfolio repóban Anna weboldala van. Készíts egy új ágon galéria oldalt, közben javíts egy sürgős hibát a fő ágon, és nézz vissza a múltba leválasztott HEAD-del! A terminál alatt élőben látszik a commitgráf.

PowerShell + Git

Windows PowerShell
Küldetések 0 / 9
    A portfolio repó commitgráfja

    13Feladatok

    Gyakorló feladatok

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

    11.1⭐CLI

    A saját repódban hozz létre egy kiserlet ágat, válts rá, és készíts rajta két commitot! Válts vissza a fő ágra: mi történt a fájlokkal? Nézd meg a git log --oneline --graph --all kimenetét.

    11.2⭐CLI

    Írasd ki a .git\HEAD és a .git\refs\heads\kiserlet fájl tartalmát! Commitolj egyet, és nézd meg újra. Mi változott, és mi nem?

    11.3⭐

    Az Ág-játszótéren készíts olyan állapotot, amelyben három ág van, és kettő ugyanarra a commitra mutat! Utána válaszd le a HEAD-et egy régi commitra, commitolj, és válts vissza egy ágra. Mit jelez a játszótér?

    11.4⭐⭐CLI

    Módosíts egy fájlt úgy, hogy a két ágon eltérő legyen, és ne commitold! Próbálj ágat váltani. Olvasd el a hibaüzenetet, és oldd meg kétféleképpen (commit, illetve git restore).

    11.5⭐⭐Desktop

    A GitHub Desktopban hozz létre egy feature/rolunk ágat, commitolj rajta, és válts vissza a fő ágra nem commitolt módosítással. Próbáld ki a Leave my changes és a Bring my changes lehetőséget is. Mit tapasztalsz?

    11.6⭐⭐CLI

    Egy régi, master ágú repóban (vagy egy újonnan, git init -b master-rel létrehozottban) nevezd át az ágat main-re, és ellenőrizd a git branch és a .git\HEAD tartalmával.

    11.7⭐⭐⭐CLI

    „Veszíts el” egy commitot leválasztott HEAD-en (commitolj, majd válts el), és mentsd meg: keresd meg a hash-ét a figyelmeztetésben vagy a git reflog-ban, és hozz létre rá ágat: git branch mentes <hash>.

    14Ö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.

    15Fogalomtár

    FogalomJelentés
    ág (branch)egy commitra mutató, mozgatható név; commitkor továbblép az új commitra
    main / mastera fő ág szokásos neve (a GitHubon 2020 óta main)
    HEADahol most állsz: általában egy ágra mutat (ref: refs/heads/main)
    leválasztott HEAD (detached HEAD)a HEAD közvetlenül egy commitra mutat, nem ágra
    elágazáskét ág történetének szétválása egy közös commit után
    git branchágak listázása, létrehozása (név), törlése (-d/-D), átnevezése (-m)
    git switchágváltás; -c: új ág + váltás; --detach: commitra
    git checkouta régi, sokoldalú parancs: ágváltás, -b új ág, commitra ugrás, fájl visszaállítása
    .git/refs/heads/itt tárolja a Git az ágakat, ágonként egy hash-t tartalmazó fájlban
    Current branch (Desktop)a GitHub Desktop ágválasztója; Leave / Bring my changes váltáskor

    16Összegzés

    1. Az ágakkal párhuzamosan, egymás zavarása nélkül dolgozhatunk; a fő ág (main, régen master) mindig működik.
    2. Az ág csak egy mozgatható címke egy commiton (.git/refs/heads/…); létrehozni szinte ingyenes.
    3. A HEAD jelöli, hol állsz; commitkor az az ág lép tovább, amelyre a HEAD mutat. Commitra váltva a HEAD leválik.
    4. git branch · git switch / -c · git checkout / -b · git branch -m · git branch -d / -D · git log --oneline --graph --all.
    5. Váltáskor a munkakönyvtár a másik ág állapotára áll; az ütköző, nem commitolt módosítás megakasztja a váltást.

    A következő fejezetben az ágakon készült munkát egyesítjük: összefésülés (merge).