Jó eséllyel mindenki hallott már a gitről, aki idetéved. Mivel nagyon jó tananyagok vannak róla ([1], [2], [3]), így ebben a leírásban csak a LibreOffice fejlesztésével kapcsolatos gyakorlatról ejtenék szót. A commitolásról és a pusholásról egy másik leírásban lesz szó, de ahhoz kapcsolódó műveletek ebben a leírásban is szerepelnek.
A letöltés/fordítás Windowson vagy Linuxon leírásokban már meg lett említve, hogy nem kell git init parancsot futtatni a git clone után, viszont fontos, hogy a gerritben beállított név és email cím legyen beállítva lokálisan is, melyről a git, gerrit regisztráció, helyi beállítások leírásban ejtettem szót.
Patchenként külön branch
Amikor letöltjük (leklónozzuk) a LibreOffice forráskódját, egyetlen alap branch (ág) jön létre, ezt pedig masternek hívják. Ha nem hozunk létre másik branchet, hanem csak a masterben dolgozunk, és onnan küldjük be a módosításainkat (patcheinket), akkor előállhat olyan eset, hogy van mondjuk egy félig kész patchünk, de közben elkezdünk egy teljesen más patchen dolgozni, és amikor azt be akarnánk küldeni, észrevesszük, hogy az előzőleg félbehagyott módosítások is érvényesek még.
Az ugyebár nyilván logikus, hogy egy patch egy commit, azaz külön küldjük be a módosításokat az áttekinthetőség érdekében (pl. ha van egy vonalstílusos és egy diagramtengelyes javításunk, akkor a kettőt külön commitoljuk, mert akkor jól látszik, hogy melyik javítás esetén milyen forrásfájlok lettek módosítva). Ahhoz, hogy egy félbehagyott patch ne kerüljön bele egy új patch commitjébe, érvényteleníteni kéne azt (pl. erre való a git checkout fájlnév parancs), aztán később, amikor újra visszatérünk a félbehagyott patchre, újra vissza kéne másolni azokat a fájlokat (már ha kimentettük őket).
Ehelyett a macera helyett jobb, ha külön branchet használunk minden egyes patchez/commithoz (kivéve persze, amikor már egy meglévő commitot akarunk módosítani a git commit --amend paranccsal).
(A parancsok futtatásához be kell lépni a LibreOffice könyvtárába).
Egy új branch létrehozásához ezt a parancsot használjuk (ekkor egyúttal át is lépünk ebbe a branchbe):
git checkout -b branchnév
git checkout -b tdf#bugszám
Például:
git checkout -b tdf#114181
Amikor létrehozunk egy új branchet, az új branch pontosan az alapján a branch alapján fog létrejönni, amiben éppen benne vagyunk. Ha tehát a masterben vagyunk, és ott már módosítottunk valamit, akkor az új branchben is érvényesek lesznek azok a módosítások (ezért érdemes a master ágat érintetlenül hagyni).
Ezzel a paranccsal íratjuk ki, hogy milyen branchben vagyunk épp, és hogy milyen egyéb branchek léteznek:
git branch
Egy már meglévő branchbe váltáshoz ezt a parancsot használhatjuk:
git checkout master
git checkout tdf#114181
Ezzel a paranccsal törölhetünk egy branchet:
git branch -d tdf#114181
Ekkor minden módosítás törlődik, amit ebben a branchben végeztünk. A többi branchre ez értelemszerűen nem lesz hatással.
Törlés, változtatások visszavonása
A legutóbbi commit óta elkövetett összes módosítás törlése (csak az aktuális branchen belül):
git reset --hard
Egy adott fájlon végzett módosítások elvetése (a legutóbbi commit óta). Ha régebben beleírtunk valamit egy adott fájlba, és most vissza szeretnénk hozni az eredeti (a beleírás előtti) állapotát, ezt a parancsot használjuk:
git checkout elérésiút/fájlnév
git checkout ./writerfilter/source/ooxml/model.xml
???Ez nyilván csak az aktuális branchben lévő fájlt fogja érinteni, a többi branch azonos nevű fájljai nem módosulnak.
A git checkout (paraméter nélküli) parancs futtatásával a módosított fájlokat listázhatjuk ki, vagyis azokat, amiket paraméterül adhatunk a git checkout parancsnak ahhoz, hogy a legutóbbi commit óta.
git checkout
Változtatások megtekintése, mentése
Egy adott branchben ezzel a paranccsal tudjuk megnézni, hogy mit módosítottunk (a legutóbbi commit óta):
git diff
Ha nem fér ki egy képernyőre, akkor a le-fel nyilakkal görgethetünk, és a q billentyűvel léphetünk ki, azaz térhetünk vissza a további parancsok futtatásához.
Ezt akár egy fájlba is lementhetjük, például:
git diff > ./fajlnev.patch
git diff > ~/eddigi_patcheim/114181.patch
A git diff paranccsal elmentett módosítások alkalmazása (az aktuális branchben):
git apply valami.patch
patch -p1 < valami.patch
Állapotlekérdezések
A git status paranccsal tudjuk megnézni, hogy milyen már meglévő fájlokat módosítottunk, és milyen új fájlokat hoztunk létre a LibreOffice könyvtárán belül:
git status
legutóbbi módosítások (csak a commitok fejléce)
git log
legutóbbi módosítások (commitok fejléce + módosított fájlok tartalma)
git log -u
legutóbbi módosítás
git log -u -1
egy adott fájl esetén
git log -u -1 elérési_út/fájlnév
például:
git log -u -1 ./chart2/source/model/template/ChartType.cxx
Legutóbbi események, tevékenységek (pl. commitolás):
git reflog
egy branchben:
git pull -r origin master
nem megy, ha van nem kommitolt változtatás
figyelem: ha merge conflict van, akkor fel kell oldani a történetet
aztán pedig: git rebase --continue!!!!!
maserben:
git pull
git cherry-pick
fájlok eltávolítása a commitból:
hozzuk az adott fájlt olyan állapotba, mint a commit előtt, git add fájl, git commit --amend
nem baj, ha a git diff mutatja a különbségeket
git format patch ^HEAD
Ez nem a végleges változat, át lesz majd dolgozva, csak azért lett közzétéve, hogy addig is elérhető legyen, hátha valakinek jól jöhet.