4. gyakorlat¶
Szerkesztés alatt!
Az oldal további része szerkesztés alatt áll, a tartalma minden további értesítés nélkül többször, gyakran, jelentősen megváltozhat!
Jelölésmód
- A továbbiakban a SDP25-IBNa1017L-% és
SDP25-IBNa1017L-%
a saját gyakorlati csoportodhoz tartozó GitLab subgroup nevét/útvonalát jelöli, amiben a%
részt a saját gyakorlatod sorszámára kell cserélni. - A továbbiakban a
hxxxxxx
a saját azonosítódat jelöli.
Feladat: git alapműveletek
- Ha nincs meg már valahol az elmúlt órákról, akkor klónozd le a saját csoportodhoz tartozó
https://git-okt.sed.inf.szte.hu/sdp25-szoftverfejlesztesifolymatok/SDP25-IBNa1017L-%/folyamatok.git
repót! - A repóban válts át a main branch-re, és biztosítsd, hogy ez szinkronban legyen a git-okt.sed.inf.szte.hu szerveren lévő változattal!
- Készíts egy
common_branch
nevű branch-et! - Készíts egy
hxxxxxx.txt
nevű fájlt egy általad választott tetszőleges idézettel, és add hozzá a branch-hez! Commit-old a változást "saját idézet" commit message-dzsel, de NE szinkronizáld a szerverrel (azaz nepush
-old)! - Készíts egy
password.txt
nevű fájltEgy aprócska kalapocska, benne csacska macska mocska.
tartalommal, "saját idézet" commit message-dzsel, de NE szinkronizáld a szerverrel (azaz nepush
-old)!
A local repository állapota
Ha mindent jól csináltál, akkor most a local repository-ban van egy common_branch
nevű branch-ed, ami a main-ből "ágazik ki" (valójában a main tetején van, nincs elágazás), és ebben van 2 commit.
Ellenőrzés:
1 |
|
1 2 3 4 |
|
Commit javítása¶
Az előbb lerontottuk! A commit message legyen inkább a "Jelszót soha nem rakunk fel Git-be!", és ennek megfelelően a fájl tartalma legyen "TITKOS!". De már megvolt a commit, ilyenkor mit lehet tenni?
A git commit --amend
parancs segítségével a legutóbbi elrontott (de még nem push-olt) commit-ot tudjuk helyrehozni.
Ez tulajdonképpen újra végrehajtja a commit-ot úgy, hogy a staging area-ban lévő új változásokat (fájltartalom változás, fájl létrehozás/törlés) is hozzáadja a commit-hoz, ezzel lecserélve az előző verziót.
Közben a commit message-et is át tudjuk írni, ha szeretnénk.
Feladat: commit javítása
Módosítsd a password.txt
nevű fájlt tartalmát TITKOS!
-ra, majd add hozzá a staging area-hoz, és javítsd ki az utolsó commit-ot.
A local repository állapota
Ha mindent jól csináltál, akkor most a local repository-ban van egy common_branch
nevű branch-ed, ami a main-ből "ágazik ki" (valójában a main tetején van, nincs elágazás), és ebben van 2 commit.
Ellenőrzés:
1 |
|
1 2 3 4 |
|
Csak lokális commit-ot javíts az amend
segítségével!
Ha egy commit már fel lett push-olva, akkor azt nem szabad a fenti módon javítani! Ez ugyanis conflict-ot okoz a helyi repó és a remote repository között, amit helyben tudsz/kell feloldani úgy, hogy visszaállsz a remote verzióra, magyarul összességében veszel egy 360°-os fordulatot (amitől legfeljebb elszédülsz, de nem változik semmi).
A remote repository szent és sérthetetlen
Létezik olyan Git parancs, amelynek segítségével a remote repository-t, annak history-ját is át lehet írni, ami nettó történelemhamisítás. Ez a parancs legfőképpen arra jó, hogy az ezzel a paranccsal elrontott repository-kat helyrehozzuk. De erről a parancsról nem beszélünk, és fokhagymás szentelt vízzel védekezünk ellene, mert a helytelen használata teljes projekteket tehet tönkre (ami leadás előtt két nappal nem éppen kellemes élmény).
Feladat: még egy commit
Készíts egy harmadik, hello.py
nevű fájlt, ami a Python-os Hello World program!
Ezt egy új commit-ban add hozzá szintén csak a local repó-hoz.
A local repository állapota
Ha mindent jól csináltál, akkor most a local repository-ban van egy common_branch
nevű branch-ed, ami a main-ből "ágazik ki" (valójában a main tetején van, nincs elágazás), és ebben van 3 commit.
Ellenőrzés:
1 |
|
1 2 3 4 5 |
|
Branch javítása¶
Hoppá, még valamit elrontottunk!
A password.txt
és hello.py
fájlokat már egy másik, hxxxxxx_branch
nevű branch-be kellett volna rakni, ráadásul egyetlen commit-ba.
Ezt a problémát a git reset
és git rebase -i
parancsokkal tudjuk helyretenni.
Reset¶
A git reset
parancs segítségével az aktuális branch-et tudjuk egy tetszőleges másik commit-ra átállítani.
Van egy git reset --hard
verziója is, ami a working copy-t is visszaállítja, így viszont a kiválasztott commit utáni esetleges változások elveszhetnek (hacsak egy másik branch-ben meg nem tartjuk őket).
Például a
1 |
|
1 |
|
Reset tetszőleges commit hash-re
A git reset
parancsok tetszőleges commit hash-ekkel működnek, de ezzel nagyon óvatosan kell bánni, mert a branch-ben egyszer már push
-olt commit-okat a remote repository-ban jóérzésű fejlesztőnek nem szokása átírni.
Feladat: új branch létrehozása
Készíts egy hxxxxxx_branch
-et.
Két egyforma branch-ed van.
Ezen a ponton (ha nem adtál ki extra parancsokat) van egy common_branch
és egy hxxxxxx_branch
nevű branch-ed, és mindkettő ugyanazon a commit-on áll.
Ellenőrzés:
1 |
|
1 2 3 4 5 |
|
Feladat: a régi branch visszaállítása
Állítsd vissza a common_branch
-et a main utáni első commit-ra.
Ezt megteheted a commit hash közvetlen használatával, vagy a HEAD~2
referenciával (merthogy az utolsó két commit-ot szeretnénk eltüntetni a branch-ből).
A két további commit most nem veszik el.
Mivel a hxxxxxx_branch
nevű branch-ed megmarad, és ez tartalmazza a common_branch
mindhárom eredeti commit-ját, a két, a common_branch
-ből kidobott commit valójában csak abból a branch-ből tűnik el, de elveszni most (egyelőre) nem fog.
Használj hard reset-et!
Mivel a változások a commit-okban úgyis megmaradnak, érdemes a git reset --hard
parancsot használni.
Így a working copy "tiszta" marad, és a következő checkout-ok nem ütköznek akadályba.
Két különböző branch-ed van.
Ezen a ponton a common_branch
a main utáni commit-on áll, a hxxxxxx_branch
branch pedig a common_branch
utáni második commit-on.
Ellenőrzés:
1 |
|
1 2 3 4 5 |
|
Interaktív rebase¶
A rebase-ről már volt szó, ezzel tudjuk az adott branch-et az egyik helyről a másikra átkötni.
Ennél viszont sokkal többet tehetünk.
A git rebase -i
parancs segítségével összevonhatunk, vagy akár ki is hagyhatunk commit-okat.
A
1 |
|
pick
parancsot átírjuk squash
-re, akkor az összevonódik az előző commit-tal.
Feladat: rebase-eljük az új branch-et
Állj át a hxxxxxx_branch
-re.
Azt szeretnénk, ha ez a main-ből ágazna ki (az valójában jelenleg is így van), nem tartalmazná a common_branch
commit-ját, és egyetlen commit-ból állna.
Interaktív rebase segítségével érd el a fentieket.
Három commit, három művelet
A git rebase -i main
parancs segítségével három commit-ot tudunk szerkeszteni.
Az elsőt egyszerűen töröljük a listából, a harmadikat (már csak másodikat) pedig pick
helyett squash
-eljük.
Eredeti git-rebase-todo
1 2 3 4 5 6 |
|
Módosított git-rebase-todo
1 2 3 4 5 |
|
Két különböző branch-ed van.
Ezen a ponton a common_branch
és a hxxxxxx_branch
branch is a main utáni egy-egy különböző commit-on áll.
Ellenőrzés:
1 |
|
1 2 3 4 5 |
|
Változások ideiglenes mentése¶
A git stash
parancs arra jó, hogy a még nem commit-olt változtatásokat elmentsük (és ezzel megtisztítsuk a working copy-t) illetve (akár egy másik branch-ben vagy commit-on) visszaállítsuk.
A git stash
parancs "elmenti" az aktuális HEAD óta történt változásokat.
Egyszerre több ilyen mentésünk is lehet, ilyenkor ezek egy veremben tárolódnak, azaz alapesetben mindig a legutóbb mentetthez férünk hozzá.
A git stash drop
egyszerűen eldobja legutóbb mentett változtatásokat.
A git stash apply
az aktuális HEAD-en megpróbálja alkalmazni a legutóbb mentett változtatásokat.
A git stash pop
az aktuális HEAD-en megpróbálja alkalmazni a legutóbb mentett változtatásokat, és ha ez sikerült, akkor ki is dobja őket a mentések közül.
Ez gyakorlatilag egy git stash apply
parancs, amit sikeres alkalmazás után egy git stash drop
követ.
Feladat: változások mentése
- Módosítsd a
hello.py
programot a working area-ban! - Próbálj meg átváltani a
common_branch
-re! - Mentsd el (
git stash
) a változásaidat! - Próbálj meg ismét átváltani a
common_branch
-re! - Válts vissza a
hxxxxxx_branch
-re! - Módosítsd a
password.txt
fájlt és commit-old a változást (de NE push-old)! - Állítsd vissza a korábban mentett változtatásaidat (
git stash pop
, vagygit stash pop
ésgit stash drop
)! - Most commit-old ezt a változást is (de NE push-old)!
A local repository állapota
Ha mindent jól csináltál, akkor most a hxxxxxx_branch
nevű branch-ed, a main-ből "ágazik ki", és 3 commit van benne.
Ellenőrzés:
1 |
|
1 2 3 4 5 6 7 |
|
Checkout¶
A git checkout
segítségével nem csak branch-eket, te tetszőleges commit-okat vissza tudunk állítani.
A parancs alkalmas továbbá az egyes fájlok/könyvtárak állapotának a HEAD-nek megfelelő verzióra való visszaállítására is.
Feladat: átállás commit-ra
Most checkout-old ki az aktuális branch kettővel ezelőtti commit-ját!
A HEAD most nem egy branch, hanem egy commit
Ellenőrzés:
1 |
|
1 2 3 4 5 6 7 |
|
Local repository megtisztítása¶
A git remote prune origin
parancs a local repository-ban törölni fogja azon branch-ek origin/
referenciáit, amik a remote repository-ban már nem léteznek.
.gitignore
¶
A git status
parancs felsorol minden, a Git által (még) nem verziókövetett fájlt, mint potenciálisan a commit-hoz hozzáadható változást.
Vannak viszont olyan fájlok, amiket biztosan soha nem szeretnénk verziókövetni (lásd 2. gyakorlat).
Ezeket a .gitignore
fájlban adhatjuk meg.
Egy adott mappában lévő .gitignore
arra a mappára és az almappáira vonatkozik, és konkrét fájlokat vagy mintákat is megadhatunk benne.
Ha a .gitignore
fájlt is verziókövetjük, akkor mindenkinél ugyanazokat a fájlokat fogjuk nem-verziókövetni.
Feladat: használj .gitignore-t
- Készíts egy
fake.png
fájlt. (touch fake.png
) - Mit mond a
git status
parancs? - A
.gitignore segítségével érd el, hogy a Git ne vegye figyelembe a
.png` végződésű fájlokat. - Most mit mond a
git status
parancs? - A
.gitgnore
fájlt sem akarjuk verziókövetni, mit lehet ilyenkor tenni?
Házi feladatok¶
Házi feladat: main branch a saját projektben
Ha még nincs main branch-ed a saját projekt-edben, akkor csinálj egyet, és a GitLab felületén állítsd be ezt fő/védett branch-nek (ha nem lesz az automatikusan).
Jogosultságok
Ha a művelet jogosultsági hiányosságok miatt nem megy (nem vagy OWNER a saját projekteden), akkor kérd a gyakorlatvezetőd segítségét.
Házi feladat: 2. mérföldkő a saját projektben
A CooSpace-en kihirdetésre kerülnek/tek a 2. mérföldkő követelményei. Ezt nézd át, és ha valamit esetleg tenned/javítanod kell, azt még a 2025-03-16 határidő előtt tedd meg!