Lokális fejlesztői branch mergelése

nov 28

Egy új fícsör fejlesztése, vagy egy bug javítása tipikusan úgy zajlik, hogy létrehozunk egy lokális branchet, abban commitolgatunk kedvünkre, majd a munka végeztével az egész ágat mergeljük a masterbe, amit aztán push-sal felküldünk a közösbe. A dolog szépséghibája, hogy ilyenkor megjelenik minden commitunk a logban, ami több szempontból is aggályos lehet: 1.) a commit message-nek csak az adott ágban volt értelme, 2.) ha resetelünk egy ilyen commitra, akkor instabil állapotba kerül a verziózott szoftver, 3.) ha resetelni kell egy korábbi stabil állapotra, akkor nehéz megállapítani, hogy melyik ilyen commit volt az előző.

A megoldás a nem stabil commitok összenyomása eggyé (squash). Ennek legegyszerűbb módja, ha a fejlesztői ágat egy commitként mergeljük az alábbi módon:

$ git merge --squash devel

A parancsot lefuttatva a devel ág összes változása megjelenik a working copynk indexében, de commit nem jön létre. Ha most kiadjuk a git status parancsot, akkor látható lesz, hogy a branch módosításai ott várakoznak, mintha csak most addoltuk volna őket (conflict természetesen előfordulhat, azt javítani kell). A következő lépésben pedig véglegesítjük a beolvasztást.

$ git commit

Direkt nem tettem bele a -m "Message here" kapcsolót, mert így be fog töltődni a message editor, ami tartalmazni fogja a teljes branch logot, azaz ha nagyon kíváncsiak vagyunk rá, hogy mi zajlott fejlesztés közben, akkor utólag bármikor megtekinthetjük (egy sort azért még illik írni az elejére, hogy mit olvasztottunk be, és akkor csak az fog megjelenni oneline módban). Ezzel létrejön a masterben egy darab új commit, ami tartalmazza a devel ágban lévő összes fejlesztésünket.

Ha mégis szükség lenne bizonyos branch commitokra, akkor az összevonásnak van egy szofisztikáltabb módja is interaktív rebase segítségével. Ezt most nem részletezem, itt egy leírás róla, akit érdekel: http://book.git-scm.com/4_interactive_rebasing.html

git