Git (3)¶
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
hxxxxxxa 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.gitrepó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_branchnevű branch-et! - Készíts egy
hxxxxxx.txtnevű 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.txtnevű 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.pyprogramot 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.txtfá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.pngfájlt. (touch fake.png) - Mit mond a
git statusparancs? - 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 statusparancs? - A
.gitgnorefá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!