Vissza az eszközökhöz

Fejlesztőkörnyezet

Git

A Git elosztott verziókezelő: a commit tartalom szerint azonosított pillanatkép, a branch és a remote pedig olcsó, ellenőrizhető művelet.

3 perc olvasás

A Git elosztott verziókezelő rendszer: minden klón egy teljes repository, benne a teljes előzménnyel, ezért a naplózás, az összehasonlítás és a commitok nagy része hálózat nélkül is működik. A szerver szerepe alapvetően a szinkronizálás, nem az, hogy a mindennapi munka feltétele legyen.

A repository objektumtár, méghozzá tartalom szerint címzett kulcs-érték tároló: a kulcs a tartalom lenyomata, amit a Git a fejléccel kiegészítve számol. Három objektumtípus számít. A blob egy fájl tartalma, a tree egy könyvtár bejegyzései (nevek, módok, mutatók blobokra és további tree-kre), a commit pedig a fa gyökerére, a szülő commitokra, a szerző adataira és az üzenetre mutat. Ugyanaz a tartalom mindig ugyanazt az azonosítót kapja, ezért a tároló ismétlődő fájlokat duplikáció nélkül tud kezelni.

A commit mint pillanatkép

  • A Git nem változáslistát tárol, hanem pillanatképeket: minden commit a projekt teljes állapotára mutat, a változatlan fájlokat pedig nem tárolja újra.
  • Mivel a commit a szülő commitok azonosítóját is tartalmazza, az előzmény visszafelé láncolt. Egy commit tartalma és az előzménye együtt határozza meg az azonosítóját, ezt utólag nem lehet szétválasztani.
  • A commit két külön szerepet is rögzít, a szerzőt és a rögzítőt. Mindkettő a commit objektum adata, ezért a szerzőség a repository ténye, nem utólagos megjegyzés.
  • Nálunk minden projekt git repository, és a deploy csak akkor indul, ha a commit szerzője a várt személy. A szerzőséget ellenőrizhető bizonyítékként kezeljük, nem formaságnak. A Vercel és a hasonló platformok ugyanerre az előzményre építik a saját deploy-jukat.

Branch, merge, konfliktus

  • A branch nem másolat a projektfáról, hanem egy fájl, benne annak a commitnak az azonosítójával, amelyre mutat. Ezért a létrehozása és a törlése gyakorlatilag azonnali.
  • A HEAD mutatja, melyik branch az aktuális. Branchváltáskor a munkakönyvtár a cél-branch utolsó commitjának állapotára áll vissza; ha ez nem megy tisztán, a Git nem engedi a váltást.
  • A merge két előzményszálat egyesít, és az eredmény egy olyan commit, amelynek két szülője van. Ezért a merge-hez nem kell külön könyvelés: maga az összeolvadás is az előzmény része.
  • Ha a módosítások ugyanarra a részre esnek, a merge megáll, a fájl konfliktusjelölőket kap, és a feloldás után a git merge --continue zárja le. A git merge --abort a merge előtti állapotot próbálja visszaállítani.
  • Nem triviális, még nem commitolt módosításokkal indított merge után a visszaállás nem garantált, ezért tiszta munkakönyvtárral érdemes mergelni.

Távoli repositoryk

  • A remote egy távoli repository rövid neve és elérése. A clone létrehozza az origin remote-ot, a fetch letölti az objektumokat és frissíti a remote-tracking branch-eket, a push pedig a helyi commitokat küldi fel.
  • A dokumentált protokollok a helyi elérés, a HTTP, az SSH és a git séma. Ez utóbbi nem használ titkosítást és nincs benne hitelesítés, ezért a dokumentáció szerint kerülendő: egy útközbeni támadó módosíthatja a klónozott repositoryt.
  • A saját Linux szerverünkön a repository bare klónként él, és SSH-n keresztül érjük el, a napi munka nagy része pedig a VS Code beépített git-integrációjában zajlik.

Az index: a következő commit előkészítése

  • Három állapot van: módosított, staged és commitolt, és ehhez három hely tartozik: a munkakönyvtár, a staging area (más néven index) és a git könyvtár.
  • A git add nem commitál, hanem az aktuális verziót jelöli meg a következő pillanatképbe. Így egy commit pontosan az lehet, amit szándékosan összeállítunk.
  • A git diff a munkakönyvtár és az index, a git diff --staged pedig az index és az utolsó commit között mutat különbséget. Ez a két nézet teszi megbízhatóvá a commit előtti ellenőrzést.

Amire figyelni kell

  • Előzmény átírása: mivel a commit tartalmazza a szülők azonosítóját, egy régi commit módosítása az összes utána következő azonosítót megváltoztatja, ezért a már megosztott előzmény átírása mindenkinél újraszinkronizálást igényel.
  • Nagy fájlok: a Git minden verziót egészben tárol, a bináris fájlokon a delta tömörítés gyakorlatilag nem fog, ezért a repository mérete néhány nagy fájltól is gyorsan nőhet, és minden klón letölti a teljes előzményt. Az ilyen fájlokra külön kiterjesztés való, nem a fő repository.
  • Szerzőség: a szerző neve és e-mail címe a commit adata, ezért a helyes beállítás nem elhagyható lépés, és egy rossz érték az egész előzményben ott marad.
  • A Git szinte mindent hozzáad az adatbázishoz és keveset töröl, de a még nem commitolt munka elveszhet.

Tovább olvasás

A CyberElectrónál a Git az alap: minden projekt repository, és a deploy a commit szerzőjének ellenőrzéséhez kötött.

Címkék
  • verziókezelés
  • commit
  • branch
  • merge
  • deploy