Vezérlőpult
14. Stash és rebase · Ágak és összefésülés

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

Stash és rebase

Két hasznos eszköz a mindennapi munkához. A stash egy „fiók”: félreteszed a félkész munkát, amikor sürgősen máshol kell dolgoznod, és később visszaveszed. A rebase a merge alternatívája: a saját commitjaidat egy új alapra „ülteti át”, így a történet egyenes marad. Megtanulod azt is, mikor ne használd a rebase-t.

CLI + DesktopMerge vagy rebase?Interaktív rebase-laborSzimulátor15 kvízkérdés

Tanulási célok

1A munka félretétele: git stash

A feature/pontszam ágon dolgozol, félkész a kód. Ekkor szólnak, hogy a main-en azonnal javítani kell egy hibát. Commitolni még nem akarsz (nem működik), ágat váltani viszont nem tudsz: a Git nem engedi, mert felülírná a módosításaidat. A megoldás:

PS> git stash -m "pontszám félkész"   # félreteszed: a munkakönyvtár tiszta lesz
Saved working directory and index state On feature/pontszam: pontszám félkész
PS> git switch main                    # most már szabadon válthatsz …
# … javítás, commit …
PS> git switch feature/pontszam
PS> git stash pop                      # visszaveszed, és folytatod

2A stash parancsai

ParancsMit csinál?
git stash · git stash push -m "üzenet"félreteszi a módosításokat (üzenettel könnyebb később megtalálni)
git stash -ua követetlen (új) fájlokat is félreteszi
git stash listkilistázza a félretett bejegyzéseket (stash@{0}: On main: …)
git stash show -p stash@{1}megmutatja, mi van egy bejegyzésben (-p: teljes diff)
git stash popvisszaállítja a legutóbbit, és törli a listából
git stash applyvisszaállítja, de a listában megtartja (pl. több ágra is kell)
git stash drop stash@{1} · git stash clearegy bejegyzés · az összes törlése
⚠️ ÜTKÖZÉS VISSZAVÉTELKOR

Ha közben ugyanazt a részt más is módosította, a pop ütközést jelez (CONFLICT … Stashed changes). Ilyenkor a bejegyzés megmarad a listában (The stash entry is kept in case you need it again). Oldd fel a 13. fejezet szerint, majd git stash drop.

💡 NE LEGYEN A STASH A PADLÁS

A stash rövid félretételre való. Ha napokig kellene tárolni a munkát, készíts inkább egy ágat, és commitold ott. A régi, elfelejtett stash-bejegyzésekről hetek múlva senki nem tudja, mik voltak.

3Stash a Desktopban és a VS Code-ban

Desktop GitHub Desktop
  • Branch → Stash all changes (vagy jobb klikk a Changes listán): minden módosítás félrekerül. A Desktop ágonként egy stash-t kezel.
  • A Changes lista alján megjelenik a Stashed Changes sor: rákattintva Restore (≈ pop) vagy Discard (≈ drop).
  • Ágváltáskor a Leave my changes on … választás is a háttérben stash-t készít (11. fejezet).
IDE VS Code
  • A Source Control panel … menüjében: Stash → Stash, Stash (Include Untracked), Apply Stash…, Pop Stash…, Drop Stash…
  • A lista a Stashes nézetben böngészhető (a GitLens bővítménnyel részletesebben is).

4Mi a rebase?

Amíg a feature ágon dolgoztál, a main is haladt. A merge ezt egy merge committal egyesítené. A rebase mást csinál: a feature saját commitjait (a közös ős utániakat) egyenként újrajátssza a main legfrissebb commitjára, mintha onnan kezdtél volna dolgozni.

PS> git switch feature
PS> git rebase main
Successfully rebased and updated refs/heads/feature.

Előtte

A git rebase main után

5Merge vagy rebase?

mergerebase
Történetmegőrzi, ahogy valójában történt (elágazás + merge commit)egyenes, „tisztított” történet
Meglévő commitokváltozatlanokújak jönnek létre (új hash); a régiek elhagyva
Ütközésfeloldásegyszer, a merge-bencommitonként, akár többször
Megosztott ágonbiztonságostilos (lásd az aranyszabályt)
Tipikus használatkész feature beolvasztása a main-be; közös ágak frissítésea saját, még fel nem töltött ág frissítése; commitok rendbetétele feltöltés előtt

Egyik sem „jobb”: csapatszabály kérdése. Kezdőként a merge a biztonságosabb. A rebase-t a saját, helyi munkád rendbetételére használd.

Merge, rebase vagy stash?

Melyik eszköz illik a helyzethez?

1 / 8Pontszám: 0
…

6Ütközés rebase közben

PS> git rebase main
CONFLICT (content): Merge conflict in jatek.js
error: could not apply 9b2e4f1... feat: pontszámítás
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
ParancsMikor?
git add fájl + git rebase --continuefeloldottad az ütközést; a rebase a következő committal folytatódik
git rebase --skipezt az egy commitot kihagyod (pl. mert a main már tartalmazza a változást)
git rebase --abortkiszállsz: minden visszaáll a rebase előtti állapotra

Rebase közben a HEAD le van választva (a git status: rebase in progress), és a jelölőkben a HEAD a main-re már átültetett állapotot, a másik oldal a te éppen újrajátszott commitodat jelenti. Ezért fordított rebase-nél az ours és a theirs jelentése (13. fejezet).

7Az aranyszabály: mikor NE

⛔ MEGOSZTOTT COMMITOT NEM REBASE-ELÜNK

Ha a commitjaid már fent vannak a GitHubon, és mások is letöltötték vagy ráépítettek, ne rebase-eld őket. A rebase új hash-ű commitokkal cseréli le a régieket: a te gépeden más történet lesz, mint a társaidén. A feltöltéshez kényszerítés kellene (git push --force, 19. fejezet), ami a társaid munkáját összekuszálja vagy felülírja.

8Interaktív rebase

A git rebase -i HEAD~4 egy szerkesztőben megnyitja az utolsó négy commit „tennivaló-listáját” (a legrégebbi felül). Minden sor elején megmondhatod, mi történjen a committal, és a sorokat át is rendezheted:

ParancsJelentése
pickmarad, ahogy van
rewordmarad, de új üzenetet adsz neki
squashbeleolvad az előtte lévőbe, az üzenetek egyesülnek
fixupbeleolvad az előtte lévőbe, a saját üzenete elvész (javító commitokhoz)
dropkimarad a történetből

Interaktív rebase-labor: tedd rendbe a történetet!

Feladat: a „wip” és az „elírás javítása” commit olvadjon bele az előtte lévőbe, a „fix” nevű commit kapjon beszédes üzenetet, a „teszt kiírás” pedig maradjon ki. A ▲▼ gombokkal a sorrendet is módosíthatod.

git-rebase-todo (így látnád a szerkesztőben)
ℹ️ AZ UTOLSÓ COMMITHOZ ELÉG AZ AMEND

Ha csak a legutolsó commitot kell javítani, arra a git commit --amend (10. fejezet) egyszerűbb. Az interaktív rebase több, régebbi commitra való. Mindkettő átírja a történetet, így ugyanaz az aranyszabály vonatkozik rájuk.

9Rebase a Desktopban és a GitHubon

Desktop Rebase
  • Branch → Rebase current branch…: válaszd ki, melyik ágra (pl. main) ültesse át. Ütközésnél ugyanaz az ablak jelenik meg, mint merge-nél.
  • A Merge into current branch… ablak gombjának legördülőjéből is választható a Rebase.
Desktop History
  • Commitok átrendezése: fogd meg, és húzd máshová a listában.
  • Összevonás: jelölj ki több commitot (Ctrl/Shift) → jobb klikk → Squash N commits…, vagy húzd az egyiket a másikra.
  • Mindez interaktív rebase a háttérben. Ha a commitok már fent vannak, a Desktop figyelmeztet, és csak kényszerített feltöltéssel (Force push) menne tovább.
Web GitHub.com
  • Pull request lezárásakor: Rebase and merge (a PR commitjai egyenként, egyenes vonalban kerülnek a main-re) és Squash and merge (egyetlen commit), 20. fejezet.

10Gyakorlás a szimulátorban

A kvizjatek repóban a feature/pontszam ágon állsz, félkész munkával. Sürgősen javítani kell egy hibát a main-en: tedd félre a munkát, javíts, vedd vissza, commitold, végül ültesd át az ágadat a frissített main-re.

PowerShell + Git

Windows PowerShell
Küldetések 0 / 8
    A kvizjatek repó commitgráfja

    11Feladatok

    Gyakorló feladatok

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

    14.1⭐CLI

    Módosíts két fájlt, és hozz létre egy újat. Futtasd a git stash-t, majd a git status-t: mi maradt? Próbáld újra -u-val. Nézd meg a git stash list-et, és vedd vissza mindkettőt.

    14.2⭐Desktop

    A GitHub Desktopban tedd félre a módosításaidat (Stash all changes), válts ágat, térj vissza, és állítsd vissza őket (Restore).

    14.3⭐

    Oldd meg az Interaktív rebase-labor feladatát, majd próbáld ki: mi történik, ha a legelső sort squash-ra állítod? Miért?

    14.4⭐⭐CLI

    Hozz létre egy ágat két committal, közben a main-en is készíts egyet. Egyszer merge-dzsel, egyszer (egy másolaton) rebase-zel egyesítsd, és hasonlítsd össze a git log --oneline --graph --all kimenetét és a commitok hash-ét.

    14.5⭐⭐CLI

    Idézz elő ütközést rebase közben! Oldd fel, és folytasd --continue-val. Egy második próbánál szállj ki --abort-tal, és ellenőrizd, hogy minden visszaállt.

    14.6⭐⭐CLI

    Készíts három „wip” commitot, majd egy git rebase -i HEAD~3 paranccsal vond össze őket egyetlen, jó üzenetű committá (az első pick, a többi squash). A szerkesztő a core.editor beállítás szerint nyílik meg (2. fejezet).

    14.7⭐⭐⭐

    Írj rövid csapatszabályt arról, mikor használtok merge-et és mikor rebase-t a közös projektben! Térj ki az aranyszabályra és a GitHub pull request összefésülési módjaira is.

    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
    stashfélretett, nem commitolt módosítások helyi verme
    stash@{n}egy félretett bejegyzés; a stash@{0} a legutóbbi
    pop · applyvisszaállítás és törlés a listából · visszaállítás, a bejegyzés marad
    rebasea saját commitok újrajátszása egy új alapra (új hash-ekkel), egyenes történetet ad
    interaktív rebasegit rebase -i: commitok összevonása, átnevezése, törlése, átrendezése
    pick · reword · squash · fixup · dropmarad · új üzenet · összevonás üzenettel · összevonás üzenet nélkül · kihagyás
    --continue · --skip · --abortfolytatás a feloldás után · a commit kihagyása · kiszállás
    aranyszabálymegosztott (feltöltött, mások által használt) commitot nem rebase-elünk
    történet átírásameglévő commitok lecserélése újakra (rebase, amend, reset); feltöltés után force push kellene

    14Összegzés

    1. git stash (-m, -u) félreteszi a félkész munkát; list, show, pop (visszaállít és töröl), apply (megtartja), drop.
    2. A git rebase main a saját commitjaidat újrajátssza a main végére: egyenes történet, új hash-ek.
    3. Rebase-ütközés: feloldás, git add, git rebase --continue; vagy --skip / --abort.
    4. Aranyszabály: megosztott commitot nem rebase-elünk; kétség esetén merge.
    5. Interaktív rebase (-i): pick, reword, squash, fixup, drop; a Desktopban húzással és a Squash menüponttal.

    A következő fejezetben a történet fontos pontjait jelöljük meg: címkék és verziószámok.