A fejlesztői munka során gyakran találkozunk olyan helyzetekkel, amikor éppen dolgozunk valamin, de hirtelen másik feladatra kell átváltanunk. Lehet, hogy egy sürgős hibajavítás érkezett, vagy kollégánk segítségére van szüksége. Ilyenkor felmerül a kérdés: mit tegyünk a félkész munkával, amit még nem szeretnénk commitolni?
A Git stash egy olyan eszköz, amely átmeneti tárolást biztosít a munkaterületen végzett változtatásokhoz. Ez a funkció lehetővé teszi, hogy gyorsan elments minden módosítást anélkül, hogy végleges commitot készítenél. A stash használata során több megközelítés létezik: egyesek minden apró változtatást stash-elnek, mások csak nagyobb munkafázisok között használják.
Az alábbi útmutató segít megérteni a stash működését, gyakorlati alkalmazási módjait és azokat a technikákat, amelyekkel hatékonyan kezelheted a félkész munkádat. Megtanulod a különböző stash parancsokat, azok opcióit, és olyan haladó technikákat is, amelyek segítségével profi szinten használhatod ezt az eszközt.
Mi az a Git stash és miért hasznos
A Git stash lényegében egy ideiglenes mentési mechanizmus, amely a working directory és a staging area állapotát tárolja el. Amikor stash-t készítesz, a Git elmenti az összes nyomon követett fájl változtatását, majd visszaállítja a munkaterületet a legutóbbi commit állapotára.
Ez a funkció különösen értékes olyan szituációkban, amikor gyors branch váltásra van szükség. Tegyük fel, hogy egy új feature-ön dolgozol, de hirtelen egy production bug miatt át kell váltanod a main ágra. A stash segítségével percek alatt elmentheted a munkádat és tiszta állapotban válthatasz.
A stash másik nagy előnye, hogy nem igényel commit üzenetet vagy végleges döntést a változtatások kapcsán. Ez ideális olyan helyzetekben, amikor még nem vagy biztos abban, hogy a jelenlegi módosításokat meg akarod-e tartani végleges formában.
Alapvető stash parancsok és használatuk
A git stash parancs szintaxisa
A legegyszerűbb stash létrehozása mindössze egy parancsot igényel:
git stash
Ez a parancs elmenti az összes módosított nyomon követett fájlt és visszaállítja a working directory-t a HEAD állapotára. A stash automatikusan kap egy azonosítót és egy alapértelmezett üzenetet.
Üzenet hozzáadása a stash-hez sokkal praktikusabb megoldás:
git stash push -m "Feature X fejlesztés közben"
Stash lista megtekintése
Az összes létrehozott stash megtekintéséhez használd a következő parancsot:
git stash list
Ez a parancs egy olyan listát ad vissza, ahol minden elem tartalmazza a stash azonosítóját, az ágat ahonnan származik, és az üzenetet. A legfrissebb stash mindig a stash@{0} azonosítót kapja.
Stash alkalmazása és visszaállítása
A legutóbbi stash alkalmazása
A legfrissebb stash visszaállítása egyszerű:
git stash pop
A pop parancs nemcsak alkalmazza a stash-t, hanem el is távolítja a stash listából. Ez a leggyakrabban használt módszer, mivel általában egyszer szeretnénk visszaállítani a mentett változtatásokat.
Stash alkalmazása törlés nélkül
Ha meg szeretnéd tartani a stash-t a listában alkalmazás után:
git stash apply
Ez különösen hasznos, ha ugyanazt a stash-t több ágon is alkalmazni szeretnéd, vagy biztosra akarsz menni, hogy a változtatások megfelelően visszaálltak.
Konkrét stash alkalmazása
Adott stash alkalmazásához használd az azonosítóját:
git stash apply stash@{2}
Haladó stash technikák
Részleges stash létrehozása
Nem mindig szeretnénk az összes változtatást stash-elni. A --patch vagy -p opció segítségével interaktívan kiválaszthatjuk, mely módosításokat szeretnénk elmenteni:
git stash push -p -m "Csak a kritikus javítások"
Ez a parancs végigmegy minden változtatáson és lehetőséget ad eldönteni, hogy azt stash-elni szeretnéd-e vagy sem.
Nem nyomon követett fájlok stash-elése
Alapértelmezetten a stash csak a nyomon követett fájlok változtatásait menti el. Az új, még nem tracked fájlok stash-eléséhez:
git stash push -u -m "Új fájlokkal együtt"
A -u vagy --include-untracked opció biztosítja, hogy az új fájlok is bekerüljenek a stash-be.
| Stash típus | Parancs | Mit tartalmaz |
|---|---|---|
| Alapértelmezett | git stash |
Nyomon követett fájlok módosításai |
| Untracked fájlokkal | git stash -u |
Tracked + untracked fájlok |
| Ignored fájlokkal | git stash -a |
Minden fájl, beleértve .gitignore-olt |
| Csak staged | git stash --staged |
Csak a staging area tartalma |
Stash kezelés és szervezés
Stash törlése
Egy konkrét stash törléséhez:
git stash drop stash@{1}
Az összes stash törlése:
git stash clear
Figyelem: Ez a parancs visszavonhatatlanul törli az összes stash-t, ezért használata előtt mindig ellenőrizd a stash lista tartalmát.
Stash tartalmának megtekintése
Egy stash részletes tartalmának megtekintéséhez:
git stash show -p stash@{0}
Ez a parancs diff formátumban mutatja meg, hogy pontosan milyen változtatások vannak a stash-ben. A -p opció nélkül csak egy összefoglaló statisztikát kapsz.
Stash és branch kezelés
Új branch létrehozása stash-ből
Gyakran előfordul, hogy egy stash tartalma alapján új ágat szeretnénk létrehozni:
git stash branch új-feature stash@{0}
Ez a parancs létrehoz egy új ágat, alkalmazza rá a stash-t, majd törli a stash-t a listából. Különösen hasznos, amikor a stash alkalmazása konfliktusokat okozna a jelenlegi ágon.
Stash alkalmazása különböző ágakon
A stash nem kötődik konkrét ághoz, így bármely ágon alkalmazható. Ez rugalmasságot biztosít a fejlesztési workflow-ban, de figyelni kell a potenciális konfliktusokra.
"A stash használata során mindig gondolj arra, hogy ez egy ideiglenes megoldás. A hosszú távú tárolásra a commit és branch mechanizmusok szolgálnak."
Konfliktuskezelés stash alkalmazásakor
Merge konfliktusok feloldása
Amikor stash-t alkalmazol, előfordulhat, hogy a jelenlegi állapot és a stash tartalma között konfliktus alakul ki. Ilyenkor a Git jelzi a problémás fájlokat:
git stash pop
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt
A konfliktusok feloldása után manuálisan kell hozzáadni a fájlokat a staging area-hoz és befejezni a merge-t.
Konfliktusok elkerülése
A konfliktusok minimalizálása érdekében érdemes gyakrabban commitolni és kisebb, logikai egységekben dolgozni. Ha tudod, hogy egy adott fájlon többen is dolgoznak, próbáld elkerülni a hosszú távú stash-elést.
| Konfliktus típusa | Oka | Megoldás |
|---|---|---|
| Content conflict | Ugyanaz a sor módosult | Manuális szerkesztés szükséges |
| Rename conflict | Fájl átnevezése | Git automatikusan kezeli |
| Delete/modify | Törölt fájl módosítása | Döntés szükséges: megtartás vagy törlés |
Stash workflow stratégiák
Napi munkafolyamat optimalizálása
A stash beépítése a napi rutinba jelentősen növelheti a produktivitást. Egy tipikus workflow lehet:
- Munka megkezdése egy feature ágon
- Sürgős feladat érkezik
- Stash készítése a jelenlegi munkáról
- Váltás a main ágra és hotfix készítése
- Visszatérés a feature ágra és stash alkalmazása
Csapatmunka és stash
Bár a stash lokális eszköz, hatással van a csapatmunka dinamikájára. Fontos, hogy a csapattagok tisztában legyenek egymás stash használatával, különösen közös fájlokon végzett munka esetén.
"A stash nem helyettesíti a megfelelő branch stratégiát, hanem kiegészíti azt. Használd eszközként, ne munkamódszerként."
Gyakori hibák és megoldásaik
Stash elvesztése
Az egyik leggyakoribb probléma, amikor valaki véletlenül törli a stash-t vagy nem találja meg. A Git reflog segítségével gyakran visszaállíthatók a "elveszett" stash-ek:
git fsck --unreachable | grep commit | cut -d' ' -f3 | xargs git log --merges --no-walk
Túl sok stash kezelése
Ha túl sok stash halmozódik fel, nehéz lehet követni őket. Érdemes rendszeresen tisztítani a stash listát és beszédes üzeneteket használni minden stash-nél.
"Egy jól szervezett stash lista olyan, mint egy rendezett íróasztal – minden a helyén van és könnyen megtalálható."
Automatizálás és scriptelés
Stash parancsok automatizálása
A gyakran használt stash műveletek automatizálhatók shell scriptekkel vagy Git alias-okkal:
git config --global alias.save 'stash push -u -m'
git config --global alias.load 'stash pop'
Pre-commit hook-ok és stash
A stash kombinálható pre-commit hook-okkal, hogy automatikusan mentse a változtatásokat bizonyos műveletek előtt. Ez különösen hasznos CI/CD környezetekben.
"Az automatizálás csak akkor értékes, ha megérti és tudatosan használja azt, aki alkalmazza."
Teljesítmény és optimalizálás
Nagy repository-k kezelése
Nagy projektekben a stash műveletek lassabbak lehetnek. Ilyenkor érdemes megfontolni a sparse-checkout használatát vagy a stash scope-jának korlátozását konkrét könyvtárakra.
Memória használat optimalizálása
A stash-ek memóriában tárolódnak, így túl sok vagy túl nagy stash befolyásolhatja a Git teljesítményét. Rendszeres tisztítás és tudatos használat szükséges.
"A teljesítmény optimalizálás nem csak a kódra vonatkozik, hanem a fejlesztői eszközök használatára is."
Stash és egyéb Git funkciók integrációja
Stash és rebase
A stash jól kombinálható a rebase műveletekkel. Gyakori pattern, hogy stash-elünk, rebase-elünk, majd visszaállítjuk a stash-t:
git stash
git rebase main
git stash pop
Stash és cherry-pick
A stash tartalmát cherry-pick-ként is alkalmazhatjuk más ágakra, ami rugalmas kód átvitelt tesz lehetővé a különböző fejlesztési ágak között.
Mi az a Git stash?
A Git stash egy ideiglenes tárolási mechanizmus, amely lehetővé teszi a working directory és staging area állapotának gyors elmentését anélkül, hogy commitot készítenénk. Ez különösen hasznos, amikor gyorsan másik feladatra kell váltanunk.
Hogyan hozok létre stash-t üzenettel?
A git stash push -m "üzenet" parancs segítségével hozhatsz létre stash-t egyedi üzenettel. Ez megkönnyíti a későbbi azonosítást, különösen ha több stash-t is kezelsz egyszerre.
Mi a különbség a git stash pop és git stash apply között?
A git stash pop alkalmazza a stash-t és törli a listából, míg a git stash apply csak alkalmazza, de megtartja a stash-t. Az apply hasznos, ha ugyanazt a stash-t több helyen is használni szeretnéd.
Hogyan stash-elek nem nyomon követett fájlokat?
A git stash push -u parancs segítségével a nem nyomon követett (untracked) fájlokat is beleteheted a stash-be. A -a opció még az ignored fájlokat is tartalmazza.
Mit tegyek, ha konfliktus keletkezik stash alkalmazásakor?
Konfliktus esetén manuálisan kell feloldanod a problémás fájlokat, majd hozzáadnod őket a staging area-hoz. A Git világosan jelzi, mely fájlokban van konfliktus, és segít a feloldás folyamatában.
Hogyan törölhetek egy konkrét stash-t?
A git stash drop stash@{n} paranccsal törölhetsz egy konkrét stash-t, ahol n a stash indexe. Az összes stash törléséhez használd a git stash clear parancsot.
