středa 29. prosince 2010

Moje soužití s distribuovaným verzovacím systémem Git

Téma distribuovaného verzovacího systému Git jsme s Filemonem nakousli v podcastu 44., ale protože jsem o tom chtěl napsat ještě před tím podcastem a navíc během toho natáčení člověka plno věcí nenapadne, rozhodl jsem se Gitu věnovat ještě pár řádek zde. Git používám posledních šest měsíců v GoodData a z toho asi polovinu hodně intenzivně a musím říci, že jsem z jeho možností úplně nadšený. Předesílám, že jsem byl velmi spokojený uživatel SVN a nic mi nechybělo, ale s použitím Gitu jsem dostal věci, které jsou opravdu velice užitečné.

Git dokáže pracovat decentralizovaně, to znamená, že může mít laptop úplně odpojený od sítě a vaše práce bude stále plnohodnotná. Git vám umožní dělat všechny operace nad repozitářem kromě pull a push, které jsou určené k synchronizaci se vzdáleným repositářem. Plnohodnotná práce znamená, že v offline módu můžete například přepínat mezi větvemi, dělat merge, cestovat historii vašich commitu (diff, blame, show atd.) a vůbec dělat další vylomeniny. Kdybych měl vypíchnout takové nejčastější operace, kterými mi Git zpříjemňuje život, pak to budou:

  • Stashovaní - máte rozdělanou práci a potřebujete se přepnout na jinou větev a nebo se vrátit obecně do určitého stavu repozitáře, ale nechcete o rozdělanou práci přijít. Přesně to stash umožňuje, je to zásobník na necommitnute věci, kam si je odložíte pro pozdější výbrání.
  • Squashování commitu - squash vám zjednodušeně řečeno umožňuje sloučení commitu do jednoho. Když pracuji na větším úkolu, kde dělám velké množství změn, tak v průběhu práce commituji průběžně. Když potom chci vypropagovat tyto změny do hlavní vývojové větvě (master), udělám to tak, že všechny commity sloučím do jednoho velkého commitu. Historie masteru, pak není tisíc a jeden commit, ale přehledný tok jednotlivých features a bugfixu. To umožňuje, aby se gatekeeper (správce repository) vyznal v tom co mu přibývá do větvě, které je považovaná v našem prostředí za stabilní a odladěnou.
  • Amend - umožňuje změnit poslední commit. Kromě toho, že múžu upravit například typo v commit message, může do commitu přidat další soubory atd.
  • Cherry pick - slouží k tomu, že můžete přenést jeden commit skrze několik větví. Klasickým případem jsou bugfixy, které je potřeba dostat jak do masteru, tak do větví z kterých buildujeme předprodukční a produkční mašiny.

Určitě jsem na něco zapomněl, napadá mě třeba možnost commitnout z daného souboru pouze jenom jeho část. Pokud Git používáte, máte možná svojí oblíbenou funkcionalitu, na kterou nedáte dopustit. To souvisí s tím jak Git používáte viz následující odstavce.

Git je dobrý sluha, ale špatný pán

Největší výhodou a nevýhodou Gitu je jeho flexibilita. Z SVN jsem byl zvyknutý na jistou šablonu používání - checkout, update, commit. V Git není jedna šablona používání, těch šablon je tolik, kolik vám nabídne Git možností a tím jak máte koncipovaný váš vývojový proces. Git rozhodně není nástroj, který vás povede za ručičku. Na druhou stranu můžete Git používat stejně jako jste používali SVN, ale potom je otázkou jestli vůbec na Git přecházet, pokud nemáte ani mentální ani technický problém.

Jak jsem již naznačil u squashování commitu náš vývojový proces orientován na masivní použití větví. Máme master větev (trunk), do které jdou odladěné věci. Na každou věc, kterou dělám, zakládám lokální větev, pokud potřebuji integrační testy a další vymoženosti, které poskytuje náš continuous integration systém, udělám tu větev i v centrální repository. Ve chvíli kdy jsem hotový, udělám merge do masteru.

Poznámka: osobně by se mi víc líbily separátní repository na větší komponenty s gatekeeperem, přes kterou by tekly všechny merge do masteru. Gatekeeper by pak udělal code review a v případě spokojenosti pusunul commit dál.

Na tomhle příkladu je vidět, že těch šablon jak používat Git je opravdu hodně a je jenom na vás najít si tu, která vám bude více vyhovovat. V podcastu jsme ještě naťukli konkurenční distribuovaný verzovací systém Mercurial. Podle ohlasů, které jsme dostali, je Mercurial v tomhle směru víc striktnější a proto možná jednoduší pro start do světa DVCS.

Nástroje

Z počátku mi dělalo velké problémy, že podpora Gitu do Eclipse je prachbídná. Nyní říkám díky za to. Problém nástrojů je v tom, že vás odstíní od toho jak Git pracuje a pokud to nepochopíte, budete mít později problém. Osobně si dokonce nedokážu představit jak dělám určité operace jenom z IDE. Díky tomu jsem se naučil používat Git z příkazové řádky a nenechám na to dopustit. Minimálně jsem se kromě Gitu naučil trochu ovládat i Vim. Pro uživatele Maca bych ještě doporučil GitX, který dokáže pěkně vizualizovat stav jednotlivých větví.

Chci se dozvědět víc