Git gyakorlat

Ennek a gyakorlatnak a célja a git alapok és a branchek, mergelés és rebaseelés használatának kipróbálása, gyakorlása.

A gyakorlat során egy Visual Studio alatt, C#-ban fejlesztett alkalmazás fejlesztésében veszel részt, melyet másik két fiktív fejlesztővel együtt fogsz elkészíteni. Az “alkalmazás” egyszerű matematikai műveleteket használ, melyek működését unit tesztekkel is ellenőrizzük. A feladat sikeres elvégzése esetén a master ágon minden unit teszt zöld lesz és lesz közöttük olyan, mely a többi fiktív fejlesztő munkájának eredménye.

Előfeltételek:

Ha a megoldás során további leírásokra, magyarázatokra lesz szükséged, az oldal végén találsz tippeket, linkeket.

1. feladat: Klónozás és futtatás

2. feladat: Saját branch és új kód

3. feladat: Már létező kód módosítása

4. feladat: Rebase

Közben kiderül, hogy Andezit is szorgalmasan dolgozik a projekten, így az ő munkáját érdemes átvenni, mert elkészült az Operations.Sub metódussal, így azt nem neked kell megírni. (Valós helyzetben ha most fetch-elnél a szerverről, akkor jelenne meg az a commit, ami Andezit ágán szerepel.)

Itt lehetne mergelni is, de a gyakorlás érdekében most törekedjünk inkább arra, hogy egy elágazásoktól mentesebb, egyenes commit gráfunk legyen. Vagyis helyezd át az eddigi munkádat Andezit ágának a végére.

5. feladat: Andezit is átveszi a változtatásaidat

Most egy kicsit megszemélyesítjük Andezitet, aki feltételezzük, hogy tovább akar majd dolgozni. Ehhez ő nem onnan kellene, hogy tovább dolgozzon, ahol az ő ága van, hanem szerencsés lenne átvennie a frissen elkészült rebase eredményét.

6. feladat: Új funkció és hozzá unit teszt készítése

A következő feladatod az osztás funkció implementálása, amihez még unit teszt sincsen. A Test Driven Development irányelve szerint ehhez először készítünk egy unit tesztet, ami elszáll (mivel még hiányzik a funkció) és utána azon dolgozunk, hogy ez a teszt zöld legyen.

7. feladat: Merge

Időközben kiderül, hogy Bazalt is dolgozott, ő meg az Operations.Mul funkciót készítette el. Azt állítja, hogy nála már zöld az erre vonatkozó unit teszt is, így ideje átvenni a fejleményeket.

Ebben az esetben a rebase művelet nem lenne nyerő dolog: a saját ágad eredményeit Andezit is használja! Éles feladat esetében a rebase után pusholtad volna, hogy Andezit is át tudja venni fast forwarddal. Ha most rebase művelettel a saját ágadnak azt a részét áthelyeznéd bazalt ágára, azzal áthelyeznéd azt a commitot is, amiből Andezit folytatni fogja a munkát. Ennek ő nagyon nem örülne! (Tanulságos kiegészítő feladatként kipróbálhatod, mit látna Andezit, ha most rebaseelnél. Ha az egész munkakönyvtárat a benne lévő .git könyvtárral együtt be-ZIP-eled, később vissza tudsz térni erre az állapotra.)

Most mergelünk, hogy semmilyen korábbi commitot ne módosítsunk.

8. feladat: Revert commit

Tegyük fel, hogy a projekt vezetés úgy dönt, az Application üdvözlő szövegei mégsem kellenek. Persze egyszerűen ki is lehetne törölni őket, de most inkább használjuk ki, hogy azok anno egy külön commitban kerültek be. (Ezért érdemes gyakran commitolni úgy, hogy egy commitban csak logikailag egybe tartozó módosítások legyenek.) Ha ez az üdvözlő szöveg egy bonyolultabb funkció lenne és nem lenne olyan triviális az eltávolítása, sokkal kényelmesebb lenne azt a régi commitot visszavonni, mintha meg sem történt volna.

Egy commit visszavonása nem módosítja a history (korábbi commitokat és így a commit gráf már elkészült részét), hanem egyszerűen a jelenlegi pontban létrehoz egy olyan commitot, ami a visszavonandó inverze: ami ott új kódsor volt, az itt most törlődik, ami pedig akkor törlődött, az most visszakerül.

9. feladat: A master ág frissítése

A fejlesztésnek ez a szakasza most véget ért. Minden unit teszt zöld, ideje publikálni kiváló alkalmazásunkat. Ehhez szerencsés, ha a master ág is az új, stabil állapotra mutat. Ezzel jelezzük másoknak, hogy a mostani állapotra már ők is építhetnek, mert nem egy köztes, fejlesztés alatti valamit találnak ott.

Az a csapaton belül egyeztetett “branching policy” kérdése, hogy ez az utolsó merge lehet-e fast forward. Ha az a célunk, hogy a mester ág csak olyan commitokat tartalmazzon, amik stabil (kiadható) állapotok voltak, akkor a fast forward itt nem jó, mert akkor a master referencia csak előrekerül a te ágad végére, de előtörténetként tartalmazni fogja a fejlesztés minden lépését. Ha ilyenkor előírod a gitnek, hogy mindenképpen hozzon létre merge commitot, akkor látszani fog, hogy a master ágba itt visszakanyarodott egy több oldalágból álló fejlesztés.

Kész! :)

Ha minden jól sikerült, mostanra a master ágon minden unit teszt zöld, de ebből nem mindent neked kellett megoldani, hanem benne van Andezit és Bazalt munkája is. Mivel a master ág most a saját ágad előtt jár, a munka folytatásakor egy mozdulattal érdemes a saját ágadat előre rakni (fast forward) a master ágra. Nagyobb projekt esetében a master előre helyezését a vezető fejlesztő végzi, így te ebből annyit látnál a munka kezdetén, hogy “Jé, előre került a master ág… gyorsan átveszem én is.”

Az, hogy valaki a merge vagy rebase műveletet használja, sokszor csak csapaton belüli megegyezés kérdése. A merge után jobban látszik, milyen ágakon folyt a munka, viszont ha már nagyon sok ág van, a rebase segít egy lineárisabb commit gráf fenntartásában. (Akik a .NET világ TFS verziókezelőjéhez szoktak hozzá, nekik a rebase hozza majd a már megszokott munkafolyamatot.) Amire mindenképpen figyelni kell, hogy rebaseelni csak olyan munkát szabad, amit még nem pusholtál, mert különben lehet, hogy valaki már munkát alapoz arra a commitra, amit később áthelyezel.

Van, akinek névre a rebase veszedelmesebbnek hangzik és ezért nem használja, pedig igazából nem nehezebb használni, mint mergelni.

Gyakran Ismételt Kérdések, további anyagok

További kérdések esetén írj! Csorba Kristóf