Modely Verzování

Všechny systémy pro správu verzí musí řešit stejný základní problém: jak se systém, který umožňuje uživatelům sdílet informace, bude bránit proti nechtěnému šlápnutí na nohu toho druhého? Je až příliš snadné, aby si uživatelé navzájem přepsali změny v úložišti.

Problém sdílení souborů

Vezměme si tento scénář: Předpokládejme, že máme dva spolupracovníky, Lojzu a Lízu. Každý z nich se rozhodne upravit stejné úložiště souborů současně. Pokud si Lojza uloží své změny úložiště první, pak je možné, že (o několik okamžiků později) Líza je mohla omylem přepsat svoji vlastní novou verzi souboru. Zatímco Lojzova verze souboru nebude navždy ztracena (protože systém si pamatuje každou změnu), všechny změny, které provedl Lojza nebudou přítomny v Lízině novější verzi souboru, protože nikdy neviděla Lojzovy změny. Lojzova práce je stále ztracena - nebo alespoň chybí v nejnovější verzi souboru - a pravděpodobně omylem. To je určitě situace, které se chceme vyhnout!

Obrázek 2.2. Problém, kterému je třeba se vyvarovat.

Problém, kterému je třeba se vyvarovat.

Řešení Zamknout-Změnit-Odemknout

Mnoho systémů pro správu verzí používá model Zamknout-Upravit-Odemknout pro řešení tohoto problému, což je velmi jednoduché řešení. V takovém systému úložiště umožňuje pouze jedné osobě provést změnu jednoho souboru najednou. Nejdříve Lojza musí zamknout soubor dříve, než do něho může začít dělat změny. Zamykání souboru je podobné jako vypůjčit si knihu z knihovny, když Lojza uzamkl soubor, Líza nemůže provádět žádné změny. Pokud se pokusí zamknout soubor, úložiště požadavek zamítne. Jediné, co může udělat, je otevřít si soubor pro čtení, a čekat až Lojza dokončí změny a zámek odemkne. Poté, co Lojza odemkne soubor, je na řadě Líza, která si může soubor zamknout a upravit ho.

Obrázek 2.3. Řešení Zamknout-Změnit-Odemknout

Řešení Zamknout-Změnit-Odemknout

Problém s modelem zamknout-změnit-odemknout je, že je trochu omezující, a často se stává překážkou pro uživatele:

  • Uzamknutí může způsobit administrativní problémy. Někdy Lojza zamkne soubor a pak na něj zapomene. Mezitím Líza, protože stále čeká na příležitost upravit soubor, má svázané ruce. A pak Lojza odjede na dovolenou. Nyní Líza musí požádat správce k odemknutí Lojzova zámku. Situace tak způsobila spoustu zbytečných průtahů a ztracený čas.

  • Zamykání může způsobit zbytečné serializace. Co když Lojza upravuje začátek textového souboru a Líza chce upravovat pouze konec stejného souboru? Tyto změny se vůbec nepřekrývají. Snadno by mohli upravovat soubor současně a žádné velké škody by nenastaly, za předpokladu, že změny byly řádně sloučeny. Není třeba, aby se v této situaci střídali.

  • Zamykání může vytvořit falešný pocit bezpečí. Předstírejme, že Lojza uzamkl a upravuje soubor A, a současně Líza zamkla a upravuje soubor B. Předpokládejme, že A i B jsou na sobě závislé a změny provedené v obou souborech jsou sémanticky neslučitelné. Najednou A i B už spolu nefungují. Systém zámků nedokázal zabránit problému - přesto nějak poskytl pocit falešného bezpečí. Je snadné pro Lojzu a Lízu si představit, že zamknutím souborů, každý začíná bezpečný, izolovaný úkol, a tím jim už od začátku bylo zabráněno prodiskutovat jejich nekompatibilní změny.

Řešení Kopírovat-Změnit-Sloučit

Subversion, CVS, a další systémy pro správu verzí používají model Kopírovat-Upravit-sloučit jako alternativa k zamykání. V tomto modelu, každý klient uživatele čte úložiště a vytvoří osobní pracovní kopii ze souboru nebo projektu. Uživatelé pak pracují paralelně, a mění svoje vlastní soukromé kopie. Nakonec soukromé kopie jsou sloučeny do nové, konečné verze. Systém pro správu verzí často pomáhá se slučováním, ale v konečném důsledku je člověk odpovědný za to, aby vše proběhlo v pořádku.

Zde je příklad. Řekněme, že Lojza a Líza si každý vytvořil pracovní kopii stejného projektu, kopírovanou z úložiště. Pracují současně, a provádějí změny ve stejném souboru A v rámci jejich kopií. Líza uloží změny do úložiště jako první. Když se Lojza pokusí uložit své změny později, úložiště ho informuje, že jeho soubor A je zastaralý. Jinými slovy, tento soubor v úložišti se od posledního zkopírování nějak změnil. Takže Lojza požádá svého klienta, aby sloučil všechny nové změny z úložiště do jeho pracovní kopie souboru A. Je zde šance, že Líziny změny se nepřekrývají s jeho, takže jakmile má obě sady změn integrovány, si uloží svou pracovní kopii zpět do úložiště.

Obrázek 2.4. Řešení Kopírovat-Změnit-Sloučit

Řešení Kopírovat-Změnit-Sloučit

Obrázek 2.5. ... Pokračování Kopírovat-Změnit-Sloučit

... Pokračování Kopírovat-Změnit-Sloučit

Ale co když se Líziny změny překrývají s Lojzovými? Co pak? Tato situace se nazývá konflikt, A obvykle to není velký problém. Když Lojza požádá svého klienta o sloučení poslední změny úložiště do jeho pracovní kopie, jeho kopie souboru A je nějakým způsobem označena, že je ve stavu konfliktu: bude moct vidět obě sady konfliktních změn, a ručně si mezi nimi vybrat. Všimněte si, že software nemůže automaticky vyřešit konflikty, pouze lidé jsou schopni porozumět a učinit nezbytné inteligentní volby. Poté, co Lojza ručně vyřešil překrývající se změny (možná po diskuzi o konfliktu s Lízou!), může bezpečně uložit sloučený soubor zpět do úložiště.

Model Kopírovat-Upravit-Sloučit může znít trochu chaoticky, ale v praxi je to velmi lehké. Uživatelé mohou pracovat paralelně, nikdo nečeká na někoho jiného. Když se pracuje na stejném souboru, nakonec se ukáže, že většina jejich souběžných změn se vůbec nepřekrývá; konflikty se dějí vzácně. A doba potřebná k řešení těchto konfliktů, je mnohem menší, než doba ztracená při zamknutí systému.

Na konec všechno záleží na jednom zásadním faktoru: komunikace mezi uživateli. Když uživatelé špatně komunikují, jak syntaktické tak sémantické konflikty se zvyšují. Žádný systém nemůže nutit uživatele komunikovat dokonale a žádný systém nemůže odhalit sémantické konflikty. Takže nemá smysl ukolébat se falešným slibem, že zamykání bude nějak předcházet konfliktům; v praxi, zamykání brzdí produktivitu víc, než cokoliv jiného.

Je jedna častá situace, kdy model Uzamknout-Změnit-Odemknout je lepší a to, když máte neslučitelné soubory. Například, pokud vaše úložiště obsahuje některé grafické obrázky a dva lidé změní obrázek ve stejnou chvíli, neexistuje žádný způsob, jak tyto změny mohou být sloučeny. Buď Lojza nebo Líza ztratí svoji změnu.

Co Subversion dělá?

Subversion používá model Kopírovat-Upravit-Sloučit jako výchozí nastavení a v mnoha případech to je vše, co budete potřebovat. Nicméně, od verze 1.2, Subversion také podporuje zamykání souborů, takže pokud máte neslučitelné soubory, nebo pokud jste prostě nuceni do zásady řízení zamykání, Subversion Vám stále bude poskytovat funkce, které potřebujete.