Verzovací systémy – svn, git, hg – svatá válka?
Který z nich je nejlepší? Nebo je lepší ještě nějaký jiný (CVS, P4 - Perforce, ClearCase, BZR)? Skvělé téma do internetových diskusí. Můžete se o nich hádat podobně jako o tom zda je lepší VIM nebo Emacs, případně jestli se má používat editor nebo IDE.
Proč vůbec verzovací systém?
Když pracujete ve skupině na nějakém „dokumentu“ vznikají vám různé verze, každý napíše něco, změní určitou část… a pak je potřeba to „dát dohromady“. Tím dokumentem může být třeba kniha, článek, často je to počítačový program (zdrojové kódy), nebo analýza či webová stránka. Jednotlivé verze si můžeme posílat třeba e-mailem, ale jsou i vyspělejší způsoby.
Technologické stupně spolupráce
Nejprimitivnějším způsobem je posílat si soubory e-mailem, nebo si je předávat na disketách. Soubor prostě vrazíte do mailu jako přílohu, nějak vtipně pojmenujete (třeba v1.0 nebo FINAL) a pošlete všem členům týmu v kopii. Maily se pěkně množí, takže máte brzo plnou schránku. Ne všichni jsou tak disciplinovaní, takže kolega např. upraví váš dokument a pošle ho všem, ale nepřejmenuje ho, takže je to pořád v1.0, ale uvnitř je už jiný obsah. Také u tzv. FINAL dokumentů se zhusta ukáže, že ještě nejsou úplně hotové a je potřeba do nich něco dodělat.
Sdílený disk
Pokud nás předchozí způsob práce přivedl do blázince nebo na pracák, budeme asi chtít po ukončení léčby nebo nalezení nového místa zkusit něco lepšího. Nasdílíme si tedy disk na nějakém síťovém serveru, třeba pomocí NFS nebo SSHFS. Soubory pak máme hezky na jednom místě a je v tom celkem pořádek a všichni vidí to samé. Čas od času odkopírujeme nějakou verzi stranou, abychom měli historii. Je to sice otrava a ruční práce, ale oproti předchozímu způsobu jsme si pomohli.
Subversion
Tohle nás nebude bavit věčně. Takže si pořídíme Subversion – SVN. Subversion je centralizovaný systém pro správu verzí. Tím centrem je server, ze kterého si stahujeme soubory na svůj disk do tzv. pracovní kopie. Změny děláme na svém disku a čas od času uděláme „commit“ – postoupíme provedené změny na server, odkud si je stáhnou ostatní. Subversion se stará o vytváření verzí a my nemusíme dělat nic. Máme kompletní historii a ke každé verzi si dokonce můžeme napsat poznámku, takže je vidět, co kdo měnil. Subversion se stará také o to, abychom omylem nepřepsali práci někoho jiného, což by se nám na sdíleném disku klidně mohlo stát.
Distribuované verzovací systémy
Do této skupiny patří Mercurial (Hg), Git, Bazaar (Bzr) a další. Oproti centralizovaným systémům přinášejí ty distribuované (DVCS) další výhody (ale abychom byli objektivní, jsou zase mírně složitější na pochopení). Můžeme např. pracovat i bez připojení k síti a halvnímu úložišti – prostě si „commitujeme“ a vesele vytváříme verze u sebe, ve svém úložišti a až se připojíme, uděláme „push“ a změny protlačíme na server a zpřístupníme je tak ostatním členům týmu. I bez internetového připojení máme k dispozici kompletní historii, všechny verze. Tyto systémy jsou obvykle výkonnější a efektivnější a spolehlivější než Subversion. Také nabízejí lepší práci s větvemi (branch). Umožňují také hrát si na svém písečku – např. si stáhnete zdrojáky nějakého svobodného softwaru a vytvoříte si jeho odnož. Využíváte při tom všech výhod verzovacího systému, „commitujete“, vytváříte verze, můžete se vrátit do historie svých změn. A čas od času se synchronizujete s původním úložištěm (stáhnete si jejich změny a sloučíte je se svými). Tohle by se Subversionem nešlo.
Velikost rozdílů
Mezi úrovní „E-mail“ a „Sdílený disk“ je rozdíl – sdíleným diskem si pomůžete. Ale mnohem znatelnější zlepšení přijde při nasazení verzovacího systému (Subversion) – to je radikální změna a velký kvalitativní skok k lepšímu.
Při přechodu ze Subversionu na distribuovaný verzovací systém také dojde ke zlepšení vaší práce. Ale tato změna už nebude tak výrazná jako v předchozím případě. Distribuovaný systém přináší pokrok, ale může to být větší pokrok, než je váš tým schopný vstřebat. Někdy totiž budete rádi, když lidi kolem vás pochopí, jak funguje Subversion a začnou ho používat. Uvědomte si, že nasadit něco i tak primitivního, jako je Subversion, je velký úspěch! Spousta jiných týmů a pracovních skupin nemá ani to a babrají se ve svých e-mailech a sdílených discích, kde si navzájem přepisují svoje soubory a přidělávají si práci.
Paradoxně jedny z nejbouřlivějších diskusí vyvolávají jednotlivé distribuované systémy – když se potká zarytý fanoušek Gitu a neméně fanatický příznivec Mercurialu, to je teprve zábava. A přitom tyhle systémy k sobě mají velice blízko a rozdíly jsou malé – oba jsou prakticky vrcholným stupněm. Pokud se mezi nimi budete rozhodovat, důvody pro jeden nebo druhý budou ležet pravděpodoně jinde, než v nich samých. Daleko víc než na rozdílech mezi nimi bude záležet na tom, s čím vaši lidé umí pracovat, jaké softwarové nadstavby pro ně existují, jak se je podaří propojit s vaším IDE nebo třeba „buildovacím“ serverem. Často taky nebudete mít na výběr – např. se budete chtít zapojit do vývoje nějakého softwaru nebo začít pracovat na své větvi → pak prostě použijete ten verzovací systém, který daný tým používá, i kdybyste měli oblíbený jiný systém. Nakonec je tedy dobré ovládat alespoň základy všech, protože se velice často budete muset přizpůsobit a jen výjimečně budete ten, kdo rozhoduje o tom, který verzovací systém se bude používat.
Tady jsem se pokusil graficky vyjádřit velikosti rozdílů mezi jednotlivými úrovněmi – nějvětší kvalitativní přírůstek a přínos, velký skok, můžete čekat od zavedení nějakého verzovacího systému – i kdyby to byl třeba ten „starý a pitomý“ Subversion, na který „všichni“ nadávají (dřív se zase nadávalo na CVS). Následný přechod na distribuovaný verzovací systém znamená rovněž pokrok – ale už ne tak velký (jsou i případy, kdy si zlepšení nevšimnete, nebo distribuovaný systém může přinést dokonce komplikace). A konečně přechod mezi jednotlivými distribuovanými verzovacími systémy znamená naprosto nicotný přínos.
Závěr
Záměrně jsem do grafu nedal, zda se v posledním políčku jedná o přechod z Gitu na Mercurial nebo z Mercurialu na Git nebo někam jinam… to je totiž jedno. Sám jsem spokojeným uživetlem Mercurialu, inspirovali mne k tomu hoši ze Sunu na jednom jejich úžasném školení (Mercurial se používá k verzování např. Netbeans, OpenJDK). Předtím jsem používal Subversion a dodnes ho na jednom projektu používám. Občas je potřeba pracovat s Gitem (jak jsem psal výše, málokdy si člověk může vybírat) a rozdíly oproti Mercurialu jsou velice malé. I ovládání a příkazy jsou dost podobné. Git se zase používá pro verzování jádra Linuxu a spoustu dalších projektů, takže má taky velmi dobré reference.
Pokud vám mohu něco poradit, pak je to: soustřeďte se na vlastní práci, kterou je psaní kvalitních programů nebo třeba knížek, a nehádejte se o nepodstatných blbostech, zda verzovat v tom či onom.
P.S. rozmanitá nabídka verzovacích systémů mi tak trochu připomíná nabídku relačních databázových systémů. U databází ale máme JDBC (případně ODBC), tedy nějaké standardizované rozhraní + ovladače pro konkrétní databáze. Je to užitečná abstrakce, která usnadňuje přechod z jednoho SŘBD na jiný, nebo psaní aplikací, které jsou schopné pracovat s více druhy databází. Existuje něco jako JDBC pro verzovací systémy? Zatím jsem nic takového nenašel… ale bylo by to hezké :-)
P.P.S. pro neinformatiky: pokud jste článek dočetli až sem, máte můj obdiv a vězte, že verzovací systémy mohou ušetřit spoustu práce i vám, kteří zrovna nic neprogramujete. Dají se skvěle použít pro spolupráci v libovolné skupině – třeba když píšete v týmu seminárku do školy nebo pracujete na společné knize s dalšími kolegy. Mercurial, Git, Subversion a další jsou svobodný a otevřený software, což kromě jiného znamená, že nemusíte kupovat nějaké pitomé licence, ale prostě si ty programy stáhnete z internetu a začnete je používat.
Odkazy
- Tenhle článek jsem chtěl napsat už dlouho, ale posledním impulzem byl až tento seriál Karla Minaříka na serveru Zdroják.Root.cz: Pět důvodů, proč zvolit Git.
- Subversion Book – elektronická kniha – příručka k systému Subversion.
- Git – dokumentace k systému Git.
- Mercurial: The Definitive Guide – online kniha o Mercurialu od Bryana O'Sullivana.
- Tutoriál o používání Mercurialu – stručně a česky.
- Bazaar – oficiální stránka verzovacího systému Bazaar (bzr).
- Joelův test – zjistěte, jak na tom vaše vývojářská skupina je. Používání verzovacího systému je zde hned jako první bod.
- hg.vps.frantovo.cz – moje zdrojové kódy verzované v Mercurialu.
CVS
Řeknu vám, zrovna před chvílí jsem musel pracovat v CVS. Fakt to ještě někdo používá! Asi čekáte, že řeknu, jaký to byl opruz, ale nebyl. A dokonce je k tomu takový hezký klient:
Prostě mi to přijde trošku banální, hádat se, v čem budeme „commitovat“. Daleko důležitější je, co budeme dělat. A proto mi taky jako mnohem zajímavější přijde diskuse o ukládání dat, která v těchto dnech poněkud nabrala na síle na serverech zdrojak.root.cz a abclinuxu.cz. Člověk může vést svoji svatou válku za tu svoji pravdu (relační SŘBD, NoSQL, XML…) nebo radši poslouchat a sledovat – s mnohými názory nesouhlasím, ale diskuse je to každopádně přínosná.
P.S. i když i tahle diskuse je vlastně o tom „jak“ a ne „co“. Ono stejně vymyslet to „co“ dá nejvíc práce (kdežto v těch ostatních ohledech „jak“ stačí koukat, aby to člověk nepo****)
Přínos
Ještě jeden komentář: Někdy přemýšlím nad přínosem zavádění IS/IT pro život :-) Potenciál pro zlepšení je v přestavbě procesů (která je umožněná novými technologiemi, které dřív nebyly), ne v tom, že vezmeme ty staré procesy a elektronizujeme je (a tak zafixujeme). Tím, že něco „dáme do počítače“ to nebude automaticky fungovat líp. Faktura jakožto dokument odráží prostředky dostupné ve své době – tužka, papír, psací stroj. Odkazovat se v argumentaci na vlastnosti „kusu papíru“ je směšné. Ten papír není nic primárního, je to jen lidský konstrukt, model snažící se zachytit nějakou skutečnost (ta je primární). Pokud chceme dělat věci líp (něž účetní za první republiky) musíme je dělat jinak…
Nevim proc Bazaar vsichni
Nevim proc Bazaar vsichni tak ustrkujou. Imho na 99% veci staci, je naprosto konzistentni, naucite se prikazy za 5 minut a plugin dovede napsat i neschopnej patlal jako ja.
Dalsi vyhodou oproti ostatnim je schopnost bezet defakto na cemkoliv (ftp,sftp,ftps,ssh,bzr+ssh etc), tudiz neni treba mit bezici server (ikdyz vam to samozrejme nikdo nezakazuje).
Zmigroval jsem u nas ve firme vsechen vyvoj z SVN (ktery pulka lidi nechapalo a porad se resili problemy se smazanim prejmenovanim souboru - vsak to znate) na Bzr a vsichni se s tim velice rychle naucili a nemenili by. (nebo se mi to boji rict ;))
Oproti totalne nekonzistentnimu gitu s miliardou prepinacu mi opravdu prijde mnohem lepsi vcs. (mluvim samozrejme o cli)
Články na AbcLinuxu
BTW: na AbcLinuxu mi teď vychází seriál Distribuované verzovací systémy.