Kihagyás

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
  1. 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!
  2. 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!
  3. Készíts egy common_branch nevű branch-et!
  4. 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 ne push-old)!
  5. Készíts egy password.txt nevű fájlt Egy aprócska kalapocska, benne csacska macska mocska. tartalommal, "saját idézet" commit message-dzsel, de NE szinkronizáld a szerverrel (azaz ne push-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
git log --oneline --decorate --graph --color --all

1
2
3
4
* 6ce8208b (HEAD -> common_branch) saját idézet
* 2808cb1c saját idézet
* fad58de7 (origin/main, origin/HEAD, main) ...
...

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
git log --oneline --decorate --graph --color --all

1
2
3
4
* 228eb9b5 (HEAD -> common_branch) Jelszót soha nem rakunk fel git-be!
* 2808cb1c saját idézet
* fad58de7 (origin/main, origin/HEAD, main) ...
...
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
git log --oneline --decorate --graph --color --all

1
2
3
4
5
* 72eb64f4 (HEAD -> common_branch) HelloWorld
* 228eb9b5 Jelszót soha nem rakunk fel git-be!
* 2808cb1c saját idézet
* fad58de7 (origin/main, origin/HEAD, main) ...
...

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
git reset HEAD~2
parancs az aktuális branch-et visszaállítja a kettővel ezelőtti commit-ra, az ahhoz képesti változások pedig a working copy-ban megmaradnak. A
1
git reset --hard main
pedig (feltételezve, hogy az aktuális branch a jelenlegi main-ből ágazott ki) gyakorlatilag törli a branch-ben lévő commit-okat a branch-ből.

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
git log --oneline --decorate --graph --color --all

1
2
3
4
5
* 72eb64f4 (HEAD -> common_branch, hxxxxxx_branch) HelloWorld
* 228eb9b5 Jelszót soha nem rakunk fel git-be!
* 2808cb1c saját idézet
* fad58de7 (origin/main, origin/HEAD, main) ...
...
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
git log --oneline --decorate --graph --color --all

1
2
3
4
5
* 72eb64f4 (hxxxxxx_branch) HelloWorld
* 228eb9b5 Jelszót soha nem rakunk fel git-be!
* 2808cb1c (HEAD -> common_branch) saját idézet
* fad58de7 (origin/main, origin/HEAD, main) ...
...

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
git rebase -i HEAD~3
paranccsal például az utolsó három commit-ot tudjuk manipulálni. Ilyenkor megnyílik egy szövegszerkesztő, és láthatóvá válik a commit-ok sorozata (egy sor egy commit). Ha ebből nemes egyszerűséggel törlünk párat, akkor azok a commit-ok művelet végén elvesznek. Ha viszont valamely commit-nál a 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
!!! output ""
```
* pick 2808cb1c saját idézet
* pick 228eb9b5 Jelszót soha nem rakunk fel git-be!
* pick 72eb64f4 HelloWorld
```
Módosított git-rebase-todo
1
2
3
4
5
!!! output ""
```
* pick 228eb9b5 Jelszót soha nem rakunk fel git-be!
* squash 72eb64f4 HelloWorld
```
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
git log --oneline --decorate --graph --color --all

1
2
3
4
5
* b1b155e (HEAD -> hxxxxxx_branch) Jelszót soha nem rakunk fel git-be!
| * 2808cb1c (common_branch) saját idézet
|/
*   fad58de7 (origin/main, origin/HEAD, main) Merge branch 'gertom'
...

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
  1. Módosítsd a hello.py programot a working area-ban!
  2. Próbálj meg átváltani a common_branch -re!
  3. Mentsd el (git stash) a változásaidat!
  4. Próbálj meg ismét átváltani a common_branch-re!
  5. Válts vissza a hxxxxxx_branch-re!
  6. Módosítsd a password.txt fájlt és commit-old a változást (de NE push-old)!
  7. Állítsd vissza a korábban mentett változtatásaidat (git stash pop, vagy git stash pop és git stash drop)!
  8. 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
git log --oneline --decorate --graph --color --all

1
2
3
4
5
6
7
* ca71d7c (HEAD -> hxxxxxx_branch) hello.py változtatás
* d30f2ad password.txt változtatás
* b1b155e Jelszót soha nem rakunk fel git-be!
| * 2808cb1c (common_branch) saját idézet
|/
*   fad58de7 (origin/main, origin/HEAD, main) Merge branch 'gertom'
...

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
git log --oneline --decorate --graph --color --all

1
2
3
4
5
6
7
* ca71d7c (hxxxxxx_branch) hello.py változtatás
* d30f2ad password.txt változtatás
* b1b155e (HEAD) Jelszót soha nem rakunk fel git-be!
| * 2808cb1c (common_branch) saját idézet
|/
*   fad58de7 (origin/main, origin/HEAD, main) Merge branch 'gertom'
...

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
  1. Készíts egy fake.png fájlt. (touch fake.png)
  2. Mit mond a git status parancs?
  3. A .gitignore segítségével érd el, hogy a Git ne vegye figyelembe a.png` végződésű fájlokat.
  4. Most mit mond a git status parancs?
  5. 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!