Git — egy elosztott verziókezelő rendszer nyílt forráskóddal, amelyet Linus Torvalds hozott létre 2005-ben a Linux kernel fejlesztéséhez. Ellentétben a centralizált rendszerekkel, mint az SVN, a Git a fejlesztő minden eszközén tárolja a repozitórium teljes másolatát, lehetővé téve a munkát állandó szerverkapcsolat nélkül. A Git SCM, 2024 adatai szerint a Git a kereskedelmi szoftverfejlesztési projektek több mint 90%-ában használatos.
Főbb pontok
Git — egy elosztott verziókezelő rendszer (VCS), amely nyomon követi a fájlok változásait és lehetővé teszi több fejlesztő számára, hogy egyszerre dolgozzanak ugyanazon a projekten. Ellentétben a centralizált rendszerekkel, a Git-ben minden fejlesztő rendelkezik a repozitórium teljes másolatával, beleértve a változtatások teljes előzményét, ami ellenállóvá teszi a rendszert az adatvesztéssel szemben, és nem igényel állandó kapcsolatot a központi szerverrel.
A Git története 2005-ben kezdődött, amikor Linus Torvalds létrehozott egy új VCS-t, miután a BitKeeper visszavonta a rendszerének ingyenes licencét a Linux kernel fejlesztői számára. A célok a következők voltak: sebesség, az architektúra egyszerűsége, a nemlineáris fejlesztés támogatása elágazáson keresztül és teljes elosztottság. 3 hónap alatt Torvalds megírta a Git magját, és egy év múlva a projekt Junio Hamano vezetése alatt önkiszolgálóvá vált.
A Stack Overflow felmérése (2024) szerint a professzionális fejlesztők 93,9%-a használja a Git-et, ami az iparág domináns verziókezelő rendszerévé teszi. A legközelebbi versenytárs — a Subversion (SVN) — csak a projektek 5,2%-ában használatos, főként nagy vállalati környezetekben, centralizált folyamatokkal.
A Git repozitórium — egy könyvtár, amelyben a Git nyomon követi az összes fájl változásait. A könyvtáron belül található egy rejtett .git mappa, ahol a rendszer összes objektuma tárolódik: commitok, fák, blobok és hivatkozások. Amikor egy fejlesztő commitot hoz létre, a Git nem másolja a fájlokat teljes egészében — pillanatképet (snapshot) készít az állapotról, és elment egy hivatkozást rá.
Minden commit tartalmaz: egyedi SHA-1 hash-t (40 karakter), hivatkozást az előző commitra (parent), szerzőt, dátumot, commit üzenetet és hivatkozást a fára (tree), amely leírja a fájlok állapotát a commit pillanatában. A commitok lánca egy irányított aciklikus gráfot alkot, ahol minden commit egy vagy több szülőre mutat.
# Repozitórium inicializálása
git init my-project
cd my-project
# Commit létrehozása
echo "Hello, Git" > README.md
git add README.md
git commit -m "Initial commit"
# Előzmények megtekintése
git log --oneline --graph --all
A Git három fő területet használ: working directory (fájlok a lemezen), staging area (index, ahová az előkészített fájlok kerülnek) és repository (commitok előzményei). A git add parancs áthelyezi a változtatásokat a munkakönyvtárból a staging-be, a git commit pedig rögzíti a staging tartalmát a repozitóriumban. Ez a szétválasztás lehetővé teszi a fejlesztő számára, hogy értelmes commitot állítson össze a változtatások halmazából anélkül, hogy minden egyes javítást külön rögzítene.
Az alapvető Git-parancsok lefedik a fejlesztő napi műveleteinek 90%-át. A git clone parancs létrehozza a távoli repozitórium helyi másolatát, a git pull letölti a változtatásokat a szerverről és egyesíti az aktuális ággal, a git push pedig elküldi a helyi commitokat a szerverre. Ez a három parancs alkotja a Git-tel való munka alapciklusát.
Az állapot megtekintéséhez a git status használatos — megmutatja, mely fájlok változtak meg, melyek lettek hozzáadva a staging-hez és melyek nem követettek. A git diff megjeleníti a konkrét változtatásokat a fájlokban a staging-hez adás előtt. Alább található a leggyakrabban használt parancsok táblázata:
| Parancs | Művelet | Példa |
|---|---|---|
| git clone | Lemásolja a távoli repozitóriumot | git clone https://example.com/repo |
| git add | Hozzáad fájlokat a staging-hez | git add src/main.kt |
| git commit | Rögzíti a változtatásokat az előzményekben | git commit -m "Fix login bug" |
| git push | Elküldi a commitokat a szerverre | git push origin main |
| git pull | Letölti a változtatásokat a szerverről | git pull origin feature |
A változtatások visszavonásához a Git több lehetőséget kínál. A git reset áthelyezi az ágmutatót a megadott commitra, és visszaállíthatja a staging-et vagy a munkakönyvtárat. A git revert létrehoz egy új commitot, amely visszavonja a megadott commit változtatásait — ez egy biztonságos visszavonási mód a megosztott ágakhoz, mivel az előzmények nem íródnak felül.
Az ágak a Git-ben — könnyű mozgatható mutatók egy adott commitra. Új ág létrehozása nem másol fájlokat, csak egy új mutatót hoz létre, ami az elágazást gyakorlatilag azonnalivá teszi. A main ág (korábban master) — a projekt fő ága, amely a stabil, kiadásra kész kódot tartalmazza.
A szabványos gyakorlat a Git Flow vagy a GitHub Flow használata. A Git Flow-ban a következő ágakat használják: main (kiadási kód), develop (integrációs ág), feature/* (új funkciók), release/* (kiadások előkészítése) és hotfix/* (sürgős javítások). A GitHub Flow egyszerűbb: csak main és feature ágak, és minden változtatás Pull Requesten keresztül kerül kézbesítésre.
# Ág létrehozása és váltása
git branch feature-auth
git checkout feature-auth
# vagy egy paranccsal:
git checkout -b feature-auth
# Ágak listája
git branch --list
git branch -a # minden ág, beleértve a távoli ágakat is
# Ág törlése
git branch -d feature-auth
A Git elágazásának fontos tulajdonsága — a cherry-pick lehetősége: egy adott commit áthelyezése egyik ágból a másikba a git cherry-pick <hash> paranccsal. Ez akkor hasznos, ha egy hibajavítást kell áthelyezni egy feature ágból a release ágba anélkül, hogy a teljes ágat egyesítenénk. A Git támogatja a rebase-t és az interaktív rebase-t (git rebase -i) a commitok összeragasztásához, átrendezéséhez és szerkesztéséhez.
Merge (egyesítés) létrehoz egy speciális merge-commitot, amelynek két szülője van. Ez a commit rögzíti két ág egyesítésének tényét, és megőrzi a teljes előzményeket — látható, hol és mikor történt az egyesítés. A Merge az előzményeket abban a formában őrzi meg, ahogy létrejöttek, ami egyszerűsíti az auditálást, de bonyolultabbá teszi a commit gráfot.
Rebase (áthelyezés) a merge-commit létrehozása helyett áthelyezi az aktuális ág commitjait a célág tetejére. Az előzmények lineárissá válnak — az a benyomás keletkezik, hogy a fejlesztés szekvenciálisan történt. Azonban a rebase felülírja az előzményeket, megváltoztatva a commitok SHA-1 hash-jeit, ami veszélyessé teszi a megosztott ágak számára, amelyekhez más fejlesztők is hozzáférnek.
Ajánlás a választáshoz: használja a merge-t a nyilvános ágakhoz, ahol az előzményeket más fejlesztők is látják (feature → develop), és a rebase-t a helyi munkához, amikor friss változtatásokat kell alkalmaznia a main-ből a saját feature ágába a Pull Request létrehozása előtt. A szabály egyszerű: ha egy commit már elküldésre került a szerverre — ne rebase-elje.
Egyesítési konfliktus akkor keletkezik, amikor a Git nem tudja automatikusan egyesíteni a változtatásokat egy fájlban. A Git megjelöli a konfliktusos részeket a fájlban speciális jelölőkkel: <<<<<<< (mi változtatásaink), ======= (elválasztó), >>>>>>> (az ő változtatásaik). A fejlesztő manuálisan szerkeszti a fájlt, kiválasztja a kívánt opciót vagy kombinálja mindkettőt, és befejezi az egyesítést egy committal.
Távoli repozitórium (remote) — a Git repozitórium másolata, amely a szerveren található. A GitHub, a GitLab és a Bitbucket a legnépszerűbb platformok a távoli repozitóriumok hosztolására. Webes felületet biztosítanak a kód megtekintéséhez, hozzáférés-kezeléshez, kód-ellenőrzéshez és CI/CD rendszerekkel való integrációhoz.
A Git-ben több távoli repozitórium is konfigurálható egy projekthez. Alapértelmezés szerint a fő remote neve origin. A git remote add parancs új remote-ot ad hozzá, a git fetch letölti a változtatásokat egyesítés nélkül, a git pull pedig a git fetch + git merge rövidítése. A Pull Request-en keresztüli kódmunkához a fejlesztő forkot készít a repozitóriumról, klónozza, feature ágban dolgozik, és egyesítési kérelmet küld az eredeti repozitóriumba.
# Távoli repozitórium hozzáadása
git remote add origin https://github.com/user/repo.git
# Távoli repozitóriumok megtekintése
git remote -v
# Ág küldése a szerverre
git push -u origin feature-auth
# Változtatások letöltése a távoli ágról
git pull origin main
A távoli repozitóriumok támogatják a címkézést a kiadási verziók jelölésére. A címkék lehetnek könnyűek (csak mutató egy commitra) és annotáltak (metaadatokat tartalmaznak: szerző, dátum, üzenet). Az annotált címkék ajánlottak a kiadási verziókhoz, mivel teljes információt adnak át a verzióról, és GPK-kulccsal aláírhatók a szerzőség ellenőrzéséhez.
Git Worktree lehetővé teszi a több ággal való egyidejű munkát különböző könyvtárakban anélkül, hogy váltogatnunk kellene közöttük. A git worktree add ../feature-auth feature-auth parancs létrehoz egy új feature-auth munkakönyvtárat, ahol kódot lehet írni anélkül, hogy a fő könyvtárban ágat kellene váltani. A Worktree hasznos a release ágban történő gyors javításokhoz, amikor a fő könyvtár hosszú távú fejlesztéssel van elfoglalva.
Git Submodules — mechanizmus az egyik Git repozitórium másikba történő beágyazására. A Submodule egy külső repozitórium rögzített commitjára tárol hivatkozást, ami garantálja a build reprodukálhatóságát. A git submodule add https://github.com/example/lib.git parancs egy külső könyvtárat ad hozzá almodulként. A submodule-okat tartalmazó projekt klónozásakor az összes függőség betöltéséhez végre kell hajtani a git submodule update --init --recursive parancsot.
Gyakran ismételt kérdések
Git — elosztott VCS helyi előzményekkel és offline munka lehetőségével. SVN — egy centralizált rendszer, amely állandó szerverkapcsolatot igényel minden művelethez, kivéve a fájlok megtekintését.
Használja a git revert HEAD-et a biztonságos visszavonáshoz (új commit jön létre). Ha a commit még nincs elküldve a szerverre, használhatja a git reset --soft HEAD~1-et.
.gitignore — egy fájl, amely felsorolja azon fájlok és könyvtárak mintáit, amelyeket a Git-nek figyelmen kívül kell hagynia. Az ideiglenes fájlok, build-ek és IDE-konfigurációk repozitóriumból való kizárására szolgál.
git fetch letölti a változtatásokat a szerverről, de nem egyesíti őket az aktuális ággal. git pull elvégzi a fetch-et és azonnal végrehajtja a merge-t. Az ellenőrzéshez használja a fetch + diff megtekintése, majd kézi merge módszert.
Használja a git commit --amend-et — ez a parancs megnyitja a szerkesztőt a commit üzenetének módosításához. Ha a commit már a szerveren van, git push --force szükséges, ami veszélyes a megosztott ágak számára.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is