Git

A Git általános tudnivalói

Git logo
Git logo

Mi az a git?

A Git egy elosztott verziókezelő rendszer, amelyet a számítógépes fájlok változásainak nyomon követésére és a szoftverfejlesztők együttműködésének koordinálására használnak. A Git a Linux kernel fejlesztésére született Linus Torvalds kezdeményezésére, miután a korábbi verziókezelő rendszer, a BitKeeper, elvesztette az ingyenes licencelést. A BitKeeper visszavonása miatt Torvalds olyan verziókezelő rendszert kívánt létrehozni, amely hatékonyan támogatja a Linux kernel fejlesztéséhez szükséges igényeket.

Miért készült?

Linus Torvalds hozta létre eredetileg a Gitet 2005-ben a Linux kernel fejlesztése során tapasztalt problémák miatt. Ekkor a BitKeeper nevű verziókezelő rendszer ingyenes licencét visszavonták, és Torvalds úgy döntött, hogy saját verziókezelő rendszert fejleszt, amely megfelel az igényeinek.

Röviden a gitről

Összességében a Git egy olyan verziókezelő rendszer, amely Linus Torvalds által kezdeményezett a személyes szükségleteiből fakadóan, és amely aztán a fejlesztői közösségek körében elterjedt, különösen a GitHub nevű online platform megjelenésével. Ma a Git alapvető eszköz a szoftverfejlesztésben és számos egyéb projekt menedzselésében is.

A git története

Kezdetek

Linus Torvalds elkezdi kifejleszteni a Git verziókezelő rendszert. Torvalds elégedetlen volt a korábbi verziókezelő rendszerekkel, amelyekkel a Linux kernel fejlesztését kezelte, és úgy érezte, hogy szükség van egy hatékonyabb és gyorsabb megoldásra.

Elnevezése

Az elnevezése, "Git", Torvalds részéről ironikus volt, és eredetileg a brit angol szlengben "kellemetlen embert" jelent. A Git elnevezése és névválasztása Torvalds humoros hozzáállását tükrözi a projektjéhez.

Első publikus kiadás

Linus Torvalds 2005. áprilisában jelentette be a Git első nyilvános kiadását. Az indulás során a Git inkább egy belső projekt volt a Linux kernel fejlesztéséhez.

Gyors népszerűség

A Git gyorsan népszerűvé vált a fejlesztői közösségek körében. A Linux kernel közösség mellett más nyílt forráskódú projektjeke is elkezdték használni a Gitet.

GitHub logo
GitHub logo

GitHub alapítása

2008-ban Tom Preston-Werner, Chris Wanstrath és PJ Hyett megalapították a GitHubot, egy online platformot, amely lehetővé tette a Git alapú verziókezelési projektek közös tárolását és együttműködését. Ez hozzájárult a Git és a GitHub népszerűségének robbanásszerű növekedéséhez.

Git elterjedése

A Git tovább terjedt és az ipari normává vált a szoftverfejlesztésben. Számos vállalat és projekt kezdte használni a Gitet a verziókezeléshez. A Git ma már a legtöbb nagy projekt és szoftverfejlesztési közösség által használt verziókezelő rendszer, ideértve a Linux kernel, a Python, a Ruby on Rails és sok más projektet.

A Git különféle használata

A Git azóta a legnépszerűbb elosztott verziókezelő rendszerré vált a fejlesztői közösségek körében. A fejlesztők nagy többsége az elsődleges verziókezelőjeként használja, és a Gitet számos szolgáltató, például a GitHub, a SourceForge, a Bitbucket és a GitLab, is használja a projektjeikhez.

Tervezése

  • Nemlineáris fejlesztés erős támogatása: A Git erősen támogatja a gyors elágazást és egyesítést, valamint speciális eszközöket tartalmaz a nemlineáris fejlesztési előzmények megjelenítéséhez és navigálásához. Az ágak könnyűek, és egy ág csak egy commit-ra utal.
  • Elosztott fejlesztés: A Git minden fejlesztőnek ad egy helyi másolatot a teljes fejlesztési előzményekről, és a változtatások könnyen átmásolódnak a tárolóból a másikba.
  • Kompatibilitás a meglévő rendszerekkel és protokollokkal: A Git támogatja különböző hálózati protokollokat, például HTTPS, HTTP, FTP, valamint a Git protokollt. Emellett kompatibilis a CVS-kiszolgálóval is.
  • Nagy projektek hatékony kezelése: A Git rendkívül gyors és skálázható, különösen nagy adattárak esetén. Gyorsabban kezeli a nagy adattárakat, mint a versenytársai, és lehetővé teszi a verzióelőzmények gyors lekérését.
  • Történelem kriptográfiai hitelesítése: A Git előzményeket olyan módon tárolja, hogy azok integritását ellenőrizni lehessen, és a régi verziókat nem lehet észrevétlenül megváltoztatni.
  • Eszközkészlet alapú tervezés: A Git C nyelven írt programokból és shell-szkriptekből áll, amelyek burkolókat biztosítanak a programok körül. Ez lehetővé teszi az összetevők könnyű összeláncolását.
  • Csatlakoztatható egyesítési stratégiák: A Git támogatja különböző összevonási stratégiákat, és lehetőséget biztosít a felhasználóknak a stratégia választására.
  • A szemét összegyűjtésig gyűlik: A Git automatikusan végzi a szemétgyűjtést a lógó objektumok eltávolítására.
  • Időszakos explicit objektumcsomagolás: A Git csomagokat használ a nagyszámú objektumok hatékony tárolásához és átviteléhez.
  • A Git eredetileg az MIT licenc alatt készült. Ezek a tervezési döntések lehetővé teszik a Git rendszer hatékony működését és skálázhatóságát, és a mai napig széles körben használják a szoftverfejlesztők a világ minden táján.

A git adatszerkezet

Változtatható index

Az index (vagy más néven szakasz vagy gyorsítótár) egy olyan adatstruktúra, amely a munkakönyvtárra és a következő véglegesítendő változatra vonatkozó információkat tárolja. Az index gyorsítótárazza ezeket az információkat a hatékonyabb véglegesítéshez.

Objektumadatbázis

Git működése
Git működése
  • Blob (bináris nagy objektum): Ezek a blobok az aktuális fájlok tartalmát tárolják. Nincsenek neveik, időbélyegeik vagy metaadatuk. Az objektumokat a tartalmuk SHA-1 hash-je alapján azonosítja a Git.
  • Fa objektum: A fa objektumok a könyvtárak megfelelői, tartalmazzák a fájlnevek listáját és egy hivatkozást egy blob- vagy faobjektumra. Ezek a fa objektumok a forrásfa pillanatképei, és lényegében egy Merkle-fát tartalmaznak, amely lehetővé teszi a fastruktúrák állapotának pontos meghatározását.
  • Véglegesítési objektum (commit): Ezek az objektumok kapcsolódnak a fa objektumokhoz és tartalmazzák azok nevét (a legfelső szintű forráskönyvtárban), időbélyeget, naplóüzenetet és a szülő véglegesítési objektumok neveit.
  • Címkeobjektum (tag): A címkeobjektumok hivatkozást tartalmaznak más objektumokra és további metaadatokat. Gyakran a digitális aláírások tárolására szolgálnak.
  • Packfile: A packfile objektumok különböző egyéb objektumokat gyűjtenek össze, és zlib-tömörített kötegként tárolják őket a hatékony tárolás és hálózati szállítás érdekében.

Minden objektumot a tartalmának SHA-1 hash-je azonosít, és a Git a hash értékét használja az objektum nevének. Az objektumok fizikailag olyan könyvtárstruktúrában tárolódnak, amely megegyezik a hash érték első két karakterével. Az hash többi része az objektum fájlneveként szolgál.

Fálj tarolása

A Git a fájl minden egyes változatát egyedi blobként tárolja, és a blobok közötti kapcsolatokat a fa és a véglegesítési objektumok elemzésével határozza meg. A Git objektumai zlib tömörítéssel tárolják a változtatásokat, hogy hatékonyan használják a tárhelyet. Ezenkívül a Git használ hivatkozásokat (refs) az objektumokhoz való hozzáféréshez és az objektumok közötti kapcsolatok kialakításához. Az objektumokhoz való hivatkozásokat különböző típusú hivatkozások (pl. fejek, távoli hivatkozások, stashek, meta hivatkozások, címkék stb.) csoportokba szervezik, és ezek az információk a referencia adatbázisban találhatók. A Git lehetőséget biztosít az objektumok automatikus szemétgyűjtésére, amelyekre már nincsenek hivatkozások.

Git parancsok

Néhány git parancs
Parancs Leírás Használat
git config Alap beállitások megadása, hogy a git verzió felvegye ki mit csinált. git config --global user.name "[név]"
git config --global user.email "[email]"
git init Inicializál egy létező git repo-t. git init
git clone Visszahoz egy repo-t a megadott url-ről. git [url]
git status Megmutatja az edig commit-olt fáljokat a színpadon. git status
git add Hozzáadja a fáljt a következő commit-odhoz , * al mindent egyszera ami a könyvtrban van. git [fáljnév]
git rm Letöröli a fáljt és hozzáadja a törlést a színpadhoz. git rm [fáljnév]
git mv Áthelyez, átnevez egy fáljt és hozzáadja a változást a színpadhoz. git mv [honna][hová]
git reset Kivesszi a fáljt a következő commit-odból, --hard -al vissza álitja a munkakönyvtárad a megadott commitra és törli a színpadot. git reset [fáljnév]
git reset --hard [commit]
git diff Megmutatja mi változot, de még nincs a színpadra adva, --staged: megmutatja mivan színpadon, de nincs még commit-olva. git diff --staged
git commit A színbadonlévő dolgaidat commitolja a repo-ba. git commit -m "[maximum 72 karakter hoszú leírás]"
git branch ki listáza az elágazásokat a repo-ba, Létre hoz egy új elágazást a megadott nével. git branch [elágazás neve]
git checkout Át lépé a munkakönyvtáradat egy másik elágazásban a repo-n. git checkout [elágazás neve]
git merge A megadott elágazást hozzá addja abba amiben éppen vagy, a git fetch [Alias] -et lehuzza a remote repo-dba git merge [elágazás neve/Alias]
git log Ki listáza az épen aktuális commitokat, meg mutatja melyik commitok nincsnek a 2. elágazáson ,de igen az 1.-n, --follow -al egy megadott fálj változásait mutaja. git log [elagázas2]..[elagázas1]
git log --follow [fáljnév]
git show Megmutatja a megadott (alapból a fej) objektum adatait (változik fajtánként). git show [objektum neve]
git remote add Lehoza a megadott repot a megadot névként. git remote ad [Alias][URL]
git fetch Le hozza a remot repo-ról a változásokat, de nem tölti le. git fetch [Alias]
git pull Le huzza a változásokat (fetch+merge). git pull
git push Fel tolja a színpadon lévő változtásokat a megfeleló elágazásba. git push
git rebase Át írja a jelenlegi helyed commitojait a megadot elágazásba. git rebase [elágazás neve]
git stash Elmenti a változásokat és a színpadot lokálisan, ha már kiadtad egyszer új bekezdésként menti el. git stash
Ki listáza az edig elrakot változásokat. git stash list
Eldobja a legfelső elrakot változást. git stash pop
Eldobja az elrakot változást. git stash drop

A git különféle megvalósításai

  • Git (C nyelvű fő implementáció): Git elsődleges implementációja C nyelven készült, és működik Linuxon, valamint a legtöbb fő operációs rendszeren, beleértve a BSD-t, Solarist, macOS-t és Windowst. A Windows támogatást különösen érdekessé teszi az, hogy először Linux-emulációs környezetet használt a Windows alatti verziókhoz. Később natív Windows buildjeit is kifejlesztették, és az MSYS2-t használják a Git for Windows terjesztéshez.
  • Gitg: A gitg egy grafikus felhasználói felület a Git-hez, és a GTK+ keretrendszert használja. Ezáltal lehetővé teszi a felhasználók számára, hogy a Git műveleteket egy grafikus felületen keresztül végezzék el.
  • JGit: A JGit egy tiszta Java szoftverkönyvtár, amelyet a Git-protokoll támogatására terveztek. Használható bármely Java alkalmazásban, és a Gerrit kód-ellenőrző eszközben, valamint az EGit Eclipse IDE Git kliensben is használják.
  • Go-git: A Go-git a Git nyílt forráskódú megvalósítása, amely tiszta Go nyelven íródott. Jelenleg olyan projektek támogatására használják, amelyek Git kódtárakat kezelnek, és titkosítást is biztosít a Git számára.
  • Git Dulwich: A Git Dulwich egy tiszta Python szoftverkomponens a Python 2.7, 3.4 és 3.5 verzióihoz. Segítségével a Git műveleteket Python alkalmazásokban is használhatják.
  • libgit2: A libgit2 egy ANSI C szoftverkönyvtár, amely a Git számára készült. Nem tartalmaz más függőséget, és több platformon is futtatható, beleértve a Windowst, Linuxot, macOS-t és BSD-t. Kötéseket biztosít több programozási nyelvhez, például Ruby, Python és Haskell.
  • JS-Git: A JS-Git egy JavaScript implementációja a Git egy részhalmazának. Ez lehetővé teszi a Git műveletek végrehajtását JavaScript nyelven.

A git szerverek

A Git szerverek olyan gépek vagy kiszolgálók, amelyeken Git-tárolókat üzemeltetnek, és lehetővé teszik a Git kliensek számára, hogy ezekkel a tárolókkal kommunikáljanak. A Git-ben beépített egyszerű Git-szerver is található, amely a git daemon paranccsal aktiválható. Emellett léteznek dedikált Git HTTP-szerverek is, amelyek további funkciókat kínálnak, például webes felületeken keresztüli tárolótartalom megjelenítést.

Különféle verziók

Gerrit logo
Gerrit logo
  • Gerrit: A Gerrit egy népszerű Git szerver, amely lehetővé teszi a kódellenőrzést és a hozzáférést SSH-n keresztül. A Gerrit kompatibilis LDAP, Active Directory, OpenID, OAuth, Kerberos/GSSAPI, X509 https kliens tanúsítványokkal. A Gerrit 3.0-val minden konfiguráció Git-lerakatként tárolva van, és nincs szükség adatbázisra a futtatáshoz.
  • Phabricator: A Phabricator egy Facebook mellékterméke, amely támogatja a Git-et is. Bár a Facebook elsősorban a Mercurialt használja, a Phabricator-ban is van Git támogatás.
  • RhodeCode Community Edition(CE): A RhodeCode (CE) egy olyan szerveralkalmazás, amely támogatja a Git, a Mercurial és a Subversion verziókezelő rendszereket. Az AGPLv3 licenc alatt áll.
  • Kallithea: A Kallithea egy Pythonban írt, GPL licenccel rendelkező szerveralkalmazás, amely támogatja a Git-et és a Mercurialt.
  • Gitolite: A Gitolite egy külső projekt, amely a Git szoftveren felül szkripteket biztosít a hozzáférés szigorú szabályozásához.
  • Git szerver mint szolgáltatás: Számos olyan szolgáltatás létezik, amelyek Git-tárolókat kínálnak felhasználóknak. Ezek közé tartozik a GitHub, a SourceForge, a Bitbucket és a GitLab, amelyek lehetővé teszik a felhasználók számára, hogy tárolókat hozzanak létre és központosítsák projektjeik fejlesztését az interneten. Mindegyiknek saját sajátosságai és előnyei vannak.
  • Egyéb: Ezenkívül vannak más önkiszolgáló Git-szervermegoldások is, például a Gogs és a Gitea, amelyek Go nyelven készültek és MIT licenccel rendelkeznek. Ezek a Git szerverek és szolgáltatások segítik a fejlesztőket a Git alapú projektkezelésben és verziókezelésben, valamint lehetővé teszik a kód megosztását és együttműködését a csapatok között.

A Git szabályai

Fő ág

Az alapértelmezett ág, amelyet sok projekt a git init paranccsal hoz létre. Gyakran az upstream távoli neve "origin", és az alapértelmezett távoli ág neve "origin/master". Bár a "master" használata az alapértelmezett ágnévként gyakori, sok helyen a "main" vagy más ágneveket is alkalmaznak, különösen a társadalmi és politikai okokból.

Commitok

Az alapelv az, hogy a kitolt commitokat nem szabad felülírni. Ehelyett vissza kell állítani a hibás változtatásokat. A véglegesítés felülírása helyett a visszaállítás szigorúbb ellenőrzést tesz lehetővé és segít megőrizni a megosztott előzmények integritását.

Git-flow

A git-flow egy népszerű munkafolyamat és elnevezési konvenció a Git használatára, amely különböző ágakat és elnevezéseket használ az instabil előzmények, instabil megosztott előzmények, gyártásra kész előzmények és kiadott termékek kezelésére. Ez segíthet a projekt fejlesztési folyamatának és kiadásainak strukturáltabbá tételében.

Lekérési kérelmek

A lekérési kérelmek(Pull Requests) nem a Git maga jellemzői, hanem inkább a Git felhőszolgáltatások (például GitHub, GitLab, Bitbucket) által biztosított funkciók. A lekérési kérelmek lehetővé teszik a fejlesztők számára, hogy kérjenek és végezzenek elágazásokat, majd kérjék, hogy azokat egyesítse egy másik ágban. Ez hatékony együttműködést és ellenőrzést tesz lehetővé a projekt fejlesztésének folyamán.

Miért van ezekre szűkség?

Ezek a szabályok segíthetnek a projektmenedzsment és az együttműködés szervezésében, különösen akkor, amikor több fejlesztő dolgozik együtt ugyanazon a projektön. Az együttműködési és verziókezelési gyakorlatok projekt-specifikusak lehetnek, és a csapat preferenciáitól függően változhatnak.

Biztonság

Hozzáférések lekezelése

A Git verziókezelő rendszer nem rendelkezik beépített hozzáférés-vezérlési mechanizmusokkal, azaz nem tartalmaz olyan eszközöket, amelyek kifejezetten a hozzáférések és jogosultságok kezelésére szolgálnak. Ehelyett a Git arra összpontosít, hogy hatékonyan kezelje a verziókezelést és az előzmények nyomon követését. A Git szerverek általában más eszközökkel támogatják a hozzáférés-vezérlést, például SSH, HTTPS vagy HTTP protokollok, valamint felhasználói hitelesítési mechanizmusok (például jelszavas vagy kulcsalapú hitelesítés). A hozzáférés-vezérlést általában a tárolószerver konfigurációja határozza meg. Olyan szolgáltatások, mint a GitHub, a GitLab vagy a Bitbucket, kiegészítő hozzáférés-vezérlési mechanizmusokat is biztosítanak, például felhasználói szerepköröket, csoportokat és hozzáférési jogosultságokat.

Ezenkívül fontos megjegyezni, hogy a Git korábbi verzióiban néhány súlyos biztonsági sérülékenységet is felfedeztek, amelyek lehetővé tették a támadók számára a rosszindulatú kód futtatását a Git rendszerrel rendelkező számítógépeken. Ezek a sérülékenységek azonban hamarosan javításra kerültek a Git szoftverben.

Alap védelmi elve

A Git belsőleg SHA-1 hash algoritmust használ az objektumok azonosításához. Bár a SHA-1 algoritmus hosszú ideje biztonságosnak számított, a számítógépes biztonsággal kapcsolatos fejlődések miatt elterjedt a SHA-1 hash-kódok biztonsági sérülékenységeinek megkérdőjelezése. Az SHA-1 hash-kódokra kifejtett "SHAttered" támadás példa volt erre. Ezért a Git az SHA-1 használatának módosítását fontolgatja, és a tervezett átállási terv részeként kriptográfiailag erősebb hash algoritmusokra való áttérést tervezi. Az SHA-1 változatot az újabb verziókban erősebb hash függvényekkel helyettesítik.

English summary

Git is an open-source distributed version control system initially developed by Linus Torvalds for the Linux kernel project after the BitKeeper version control system, previously used, lost its free licensing. Torvalds aimed to create a version control system that effectively supported the needs of Linux kernel development.

Linus Torvalds created Git in 2005 due to issues faced during the development of the Linux kernel. BitKeeper, the previous version control system, had withdrawn its free license, leading Torvalds to develop a version control system that met his requirements.

Git is widely used for software development and project management, particularly since the emergence of online platforms like GitHub. It has become an essential tool in the software development field and is used in various other projects as well.

Git is the most popular distributed version control system among developer communities. Many developers use Git as their primary version control tool, and it is also employed by service providers like GitHub, SourceForge, Bitbucket, and GitLab.

Git's design principles include strong support for non-linear development, distributed development, compatibility with existing systems and protocols, efficient management of large projects, cryptographic verification of history, component-based design, and customizable merging strategies.