Főoldal Cikkek Galéria Projektek Tagok Tudásbázis Tanfolyam 3D Nyomtatás

A Git verziókezelő rendszer

Problémafelvetés

Biztos találkoztál már olyannal, vagy te is kerültél olyan helyzetbe, hogy egy fájlról vagy projektról szerettél volna egyszerre több verziót is tárolni. Ilyenkor kerülnek elő az olyan megoldások, mint a különböző állapotok dátumokkal jelölt mappákba másolása, vagy a beszamolo_vegleges_final_eztkulddbe.docx fájlnevek megadása.

Ezt a problémát még többszörösen bonyolítja az, ha az adott munkát csoportban végezzük, ekkor nem csak saját magunknál kell megoldani a verziók követését, hanem ezt még másokkal is szinkronizálnunk kell, ennek az általános megoldása az e-mailben zipek küldése, vagy Dropboxon megosztás.

A Git ezt a (két) problémát hivatott megoldani, illetve még sok mást, amiről eddig nem is tudtad, hogy zavar.

Git - első lépések

A Gitben az egyes követett projekteket repositorynak hívjuk. Első megközelítésben minden fájl, ami ebben a mappában van, követve lesz. Egy ilyen repositoryt a következő parancssal hozhatunk létre:

$ git init .
Initialized empty Git repository in /home/user/sandbox/.git/

Ez a jelenlegi mappát fogja repositoryként kezelni (amelyben éppen állunk). Ezek után már ki is próbálhatunk pár egyszerű git parancsot, ami a repositorynk (röviden repó) állapotáról tud információt szolgáltatni.

$ git status
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

A kimenet itt rögtön több olyan fogalmat is használ, amikről egyelőre semmit nem tudunk, de látszólag fontosak lesznek (branch? commit?). Próbáljunk ki egy másik parancsot is.

$ git log
fatal: your current branch 'master' does not have any commits yet

Tehát tudjuk azt, hogy jelenleg a master nevű branchen állunk, és nincsen commitunk. Na jó, inkább essünk neki a projektünknek. Hozzunk létre egy új fájlt a mappában, tartalomként írjunk bele például egy “Helló, világ!”-ot.

$ echo Hello, vilag! > file.txt
$ ls
file.txt

Próbáljunk most újra egy git status-t futtatni! A kimenetben közli velünk a git, hogy van egy untracked fájlunk, illetve, hogy a git add paranccsal tudjuk azt hozzáadni a commitunkhoz. Na jó, de mi is az a commit?

Commitok

A commit a gitben a változtatások egysége. Egyfajta csomagnak tekinthetjük, egy commit tartalmazza (jó esetben) az egybetartozó változtatásokat a projekt fájljaiban.

Ha például volt egy függvényed egy modulban, amit a főprogram használ, és ennek a függvénynek megváltoztatod a visszatérési típusát int-ről double-re, akkor ez a pár sor változtatás egy egészt alkot, egy commitba illik. (Ha e-mailben tartanád a kapcsolatot a társaiddal, akkor miután elvégezted ezt a változtatást, ezt a két fájlt, vagy a projekt zipjét elküldenéd nekik, hogy ők már ezen dolgozzanak tovább).

A commitokhoz az adott változtatásokon kívül tartozik a szerkesztő e-mail címe, neve, a commit időpontja és egy hash érték, amivel a commit egyértelműen azonosítható. Meg kell adni továbbá egy rövid címet, ami leírja, miket változtattunk a commitban.

Nézzük akkor először a változtatásokat. Az imént létrehoztunk egy új fájlt, de a git status szerint ezt még nem adtuk hozzá a commitunkhoz. Tehát a változtatásaink nem adódnak hozzá automatikusan az aktuális commithoz.

$ git add file.txt

Történt valami? Nézzük meg a git status segítségével. Úgy tűnik, hogy sikerült hozzáadni, most már Changes to be committed felirat alatt jelenik meg! Na, akkor már csak a commitot kell létrehozni. Először is, ha még nem tettük volna meg, meg kell mondanunk a gitnek, hogy kik vagyunk (milyen aláírással lássa el a commitunkat).

$ git config --global user.email "[email protected]"
$ git config --global user.name "Gipsz Jakab"

A jövőre tekintve, itt olyan e-mail címet érdemes megadni, ami a GitHub felhasználónkhoz is be van regisztrálva, ugyanis az oldal ez alapján linkeli a commitokat felhasználókhoz. Ha ezzel megvagyunk, már tényleg csak a commit létrehozása van hátra.

$ git commit -m "My first commit"

Itt a -m kapcsolóval adtuk meg a commit címét. Ha csak egyszerűen git commit-ot írunk, akkor megnyílik az alapértelmezett szövegszerkesztő (vigyázat, vi[m]!), és ebben adhatjuk ezt meg.

Ha ezzel megvagyunk, nézzünk megint egy statust. Itt újra azzal találkozunk, hogy nincs mit commitolni. Ilyenkor az ember szeretné megnézni, hogy sikerült-e létrehoznunk a commitot.

$ git log

Ezzel a paranccsal listázhatjuk a commitokat, és ha minden jól meg, itt meg is jelenik a mienk.

A .gitignore

Mi van akkor, ha nem szeretnénk minden fájlt követni, ami a mappában van? Tegyük fel, hogy a repót később szeretnénk GitHub-ra publikálni, de a programunknak része egy config.json, ami az adatbázis adatait (többek között a kapcsolódáshoz tartozó jelszót) tartalmazza. Erre a célra lett kitalálva a .gitignore fájl. (Windowson figyeljünk arra, hogy a kiterjesztés a gitignore, neve nincs a fájlnak.)

Ebben a fájlban sorolhatjuk fel azokat az elérési utakat, amiket a git figyelmen kívül fog hagyni. Az előző példa alapján létrehozhatunk a mappánkban egy gitignoret.

$ echo config.json > .gitignore

Adjuk ezt hozzá a commitunkhoz (git add .gitignore). Ezután hozzunk létre egy config.json-t, és nézzük meg a git status kimenetét. Ha minden jól megy, a git nem fog változást detektálni a mappában. A .gitignore-ban nem csak konkrét fájlneveket adhatunk meg, hanem például teljes mappákat is (mappa), vagy regex mintákat (*.json).