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.
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 --continuezárja le. Agit merge --aborta 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 addnem 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 diffa munkakönyvtár és az index, agit diff --stagedpedig 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.