Sziasztok!
Arra gondoltam, hogy jó lenne kicsit most már elindulni a Git használatának azon az útján, amikor is úgy tekintünk rá, mint a fejlesztés során használt eszközre. Eleddig megnéztünk, hogy igazából hogyan tudjuk használni, milyen feature-ök vannak, és hogyan segíthetik a fejlesztést, de az eddigiek valójában még nem fedik a teljes igazságot, sőt… mindig csak egy kicsit kerülünk hozzá közelebb, ahogy a mostani bejegyzés is ezt segíti.
Branchek
Amikor fejlesztünk, akkor bizonyos nézőpontokat nem árt figyelembe venni. Jelenleg ugye egyfejlesztős projektben veszünk részt, és bizony egy fejlesztő is úgy össze tudja kuszálni a Git-ben kezelt verziókat, hogy problémáink lehetnek. Amikor elkezdesz valamit fejleszteni, akkor gondold mindig végig, hogy mi célja annak amit csinálsz? Tipikusan ha diplomamunkán dolgozol, akkor a célod az, hogy legyen egy végső release-ed, ami megfelel a követelményeknek. Ha van konzulensed, és Ő véletlenül szeretné látni hogyan haladsz, akkor ez is részét képezi a céljaidnak, tehát ennek megfelelően kell használnod a Git-et is. Tegyük fel, hogy ennek a két feltételnek kell teljesülnie. Hogyan szeretnéd használni a Git-et? Mit teszel annak érdekében, hogy ha a konzulensed azt mondja, gyere be hozzám holnap, és hozd el amid van, akkor egy olyan állapotot vigyél el, ami nem éget le, mert épp rossz pillanatban szólt, és benne vagy egy másfélhetes session közepében? (Lehet a példa nem a legjobb, de remélem érthető mit szeretnék mondani!)
Ebben az esetben valószínűleg izgatottan elkezded keresni a Git-ben azt a pontot, amikor még működött az alkalmazás, és valahogy megpróbálsz visszaállni oda, vagy tudomisén, lehet Gittől függetlenül kézzel elkezded kiszedegetni a kódod azon részeit, amiken épp most dolgozol.
Hogyan kezeljük ezt a problémát a Gitben?
Amikor egy commit-ot csinálsz, akkor láthatod az alábbi sort:
[master <short sha>] <commit message>
Ezt hívjuk úgy, hogy a master branch-en lévő snapshot-on dolgozunk, ez a default ág. Vegyünk fel develop branchet (vagy brancheket, ez sokmindentől függ…), ezeken folynak a fejlesztések. Amikor a fejlesztéseket elkészítettük, akkor ezeket fogjuk a master branch-re mergelni, és elnevezni úgy, hogy abból kiderüljön mely taskok/komplex feladatok tartoznak hozzá.
Egyszerűsített példa
Tegyük fel, hogy el kell készítenünk egy alkalmazást, amelyen az alábbi funkciókat kell megvalósítanunk:
-
login
-
regisztráció
-
regisztrációs adatok módosítása
-
email küldés funkció
Első lépésként a master branch-re commitoljuk be mondjuk a dokumentációs fájlokat, a tervezés során létrejövő dokumentumokat:
$ git init
Initialized empty Git repository in /tmp/zerotohero_branch01/.git/
$ git add design.doc
$ git commit -m”design”
[master (root-commit) 93c5a19] design
0 files changed
create mode 100644 design.doc
$ git branch
* master
$
A git branch parancs mutatja meg milyen branchek találhatóak, és * – gal jelöli az aktuális branchet. Következő task-ként csináljuk meg a skeleton branch-et, amelyen létrehozzuk az alkalmazás vázát: létrehozzuk a maven projektet, behúzzuk a használni kívánt dependenciákat, konfigoljuk a szükséges resource-okat, stb.stb.
$ git branch skeleton # új branch létrehozása
$ git branch # ellenőrizzük, hogy tényleg létrejött – e?
* master
skeleton
$ git checkout skeleton # átváltunk az új ág-ra.
Switched to branch ‘skeleton’
$
Ezekután elkezdhetjük a skeleton létrehozását (Most nem fogom lefejleszteni a kitalációmat, inkább csenek egy sort a ‘Maven alapok’-ból :) ):
$ mvn archetype:generate -DgroupId=hu.zerotohero -DartifactId=hello-world -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
…
$ git add –all
$ git commit -m „működő skeleton”
[skeleton db70301] működő skeleton
3 files changed, 69 insertions(+)
create mode 100644 hello-world/pom.xml
create mode 100644 hello-world/src/main/java/hu/zerotohero/App.java
create mode 100644 hello-world/src/test/java/hu/zerotohero/AppTest.java
$
Ez az a pont, amikor tutira működik minden, és azt mondjuk, hogy ez lesz az alkalmazásunk egyik „publikus” verziója. Tehát fűzzük rá a master branch-re:
$ git branch
master
* skeleton
$ git checkout master
Switched to branch ‘master’
$ git merge skeleton
Updating 93c5a19..db70301
Fast-forward
hello-world/pom.xml | 18 ++++++++++
hello-world/src/main/java/hu/zerotohero/App.java | 13 +++++++
…/src/test/java/hu/zerotohero/AppTest.java | 38 ++++++++++++++++++++
3 files changed, 69 insertions(+)
create mode 100644 hello-world/pom.xml
create mode 100644 hello-world/src/main/java/hu/zerotohero/App.java
create mode 100644 hello-world/src/test/java/hu/zerotohero/AppTest.java
$
Sikeresen összefűztük, jelenleg a master branch és a skeleton branch teljesen megegyezik. Következő lépésként a funkciókat kezdhetjük el fejleszteni, kezdjük a loginnal:
$ git checkout -b feature/login
# Létrehozza és át is vált az új branchre.
Switched to a new branch ‘feature/login’
$ git branch
* feature/login
# Érdemes valamilyen csoportok köré szervezni a brancheket
master
# Mert elég sok lehet belőlük, ez megint scope kérdése
skeleton
$
Itt is elvégezzük a fejlesztéseket, majd ha készek vagyunk mergeljünk a masterre, és így tovább a következő feature-ök megvalósítása során. Így tudjuk biztosítani azt, hogy mindig van egy águnk, amelyen a kód biztosan fut, és bármikor publikálható. Megeshet, hogy a master branch-en is hibát vétettünk, akkor az aktuális állapotból elágazunk egy új (vagy már meglévő) hotfixes branchre, kijavítjuk a hibát, majd mergeljük a master branch-re, és nyilván azokra az aktív branchekre, amelyen a fejlesztés folyik.
Azért az én egyszerűsített példám csak részben alkalmazható nagyobb fejlesztésekre. Ugyanis itt további managelési problémákra adott válaszok alapján kell majd használnunk a Git-et, de ennyire ne rohanjunk előre. :)
Amit itt bemutattam az példának talán jó, és annak, hogy képben legyünk a branch-ek kezelésével, de ez a példa a legegyszerűbb volt. Ha csapatmunkában találod magad, akkor még megannyi problémád lesz, amiket később ecsetelhetünk. Most koncentráljunk arra, hogy a brancheket tudjuk kezelni, és a fejlesztés ne egy master branch-en történjen, mert azzal nagyon megkönnyíted az életed.