Modeli verzionisanja

Svi sistemi kontrole verzija imaju da reše iste osnovne probleme: kako će sistem omogućiti korisnicima da dele informacije, ali da ih spreči da nehotično koračaju stopama jedni drugih? Veoma je lako da jedni drugima korisnici incidentno prepišu promene u spremištu.

Problem Fajl-Deljenja

Zamislimo ovaj scenario: pretpostavimo da imamo dva saradnika, Hari i Sali. Svaki odluči da uredi isti fajl iz spremišta u isto vreme. Ako Hari prvi sačuva svoje izmene u spremište, tada je moguće (nekoliko trenutaka kasnije) da ih Sali nehotice prepiše svojom novom verzijom fajla. Pošto Harijeva verzija fajla neće biti izgubljena zauvek (jer sistem pamti sve promene), sve promene koje je uradio Hari neće biti prisutne u Salinoj novoj verziji fajla, jer ona nije videla Harijeve izmene na početku rada. Harijev rad je efektivno izgubljen - ili u najmanjem nedostaje u zadnjoj verziji fajla - i verovatno mimo plana. Ovo je defintivno situacija koju želimo da izbegnemo.

Slika 2.2. Kako izbeći problem

Kako izbeći problem

Zaključaj-Menjaj-Otključaj rešenje

Mnogi sistemi kontrole verzija koriste zaključaj-izmeni-otključaj model da označe ovaj problem, što je veoma jednostavno rešenje. U takvim sistemima, spremište dozvoljava samo jednoj osobi da menja fajl u isto vreme. Prvo Hari mora zaključati fajl pre nego što može da ga menja. Zaključavanje fajla je mnogo slično pozajmljivanju knjige iz biblioteke; ako Hari ima zaključani fajl, onda Sali ne može da napravi bilo kakvu izmenu na njemu. Ako ona pokuša da zaključa fajl spremište će zabraniti zahtev. Sve što može uraditi je da čita fajl i čeka da Hari završi svoje izmene i otključa fajl. Kada Hari otključa fajl, on ga vraća i Sali ga može uzeti zaključavanjem i da ga uređuje.

Slika 2.3. Zaključaj-Menjaj-Otključaj rešenje

Zaključaj-Menjaj-Otključaj rešenje

Problem sa zaključaj-izmeni-otključaj modelom je da je pomalo restriktiv i često postaje prepreka za korisnike:

  • Zaključavanje može da napravi administrativni problem. Ponekad Hari će zaključati fajl i zaboraviti na njega. Međutim, pošto Sali još čeka da uredi fajl, njene ruke se vezane. I onda Hari odlazi na odmor. Sada Sali ima da dobije od Administratora oslobađanje Harijevog zaključavanja. Situacija se završava uzrokujući puno nepotrebnog kašnjenja i izgubljenog vremena.

  • Zaključavanje može da prouzrokuje neželjenu serijalizaciju. Šta ako Hari uređuje početak tekst fajla, a Sali jednostavno želi da uredi kraj istog fajla? Ove izmene se uopšte ne preklapaju. Oni mogu lako da uređuju fajl istovremeno, neće doći do velike štete, uzevši da se izmene odgovarajuće ujedine. NJima nije potrebno da se okrenu od ovakve situacije.

  • Zaključavanje može da stvori lažni osećaj sigurnosti. Uzmimo da Hari zaključa i uređuje fajl A, dok Sali istovremeno zaključa i uređuje fajl B. Pretpostavimo da A i B zavise jedan od drugog i da izmene urađene na bilo kome semantički nisu kompatibilne. Iznenada A i B ne rade više zajedno. Zaključavajući sistem nema snage da predupredi problem - čak nekako daje osećaj lažne sigurnosti. Lako je da Hari i Sali zamisle to zaključavanjem fajlova, svako počinje siguran, izdvojen zadatak i to ga sprečava da razmatra nekompatibilne izmene učinjene ranije.

Kopiraj-Menjaj-Stopi rešenje

Subverzija, CVS i drugi sitmi kontrole verzija koriste kopiraj-izmeni-stopi model kao alternativu zaključavanju. U ovom modelu svaki korisnički klijent čita spremište i kreira sopstvenu radnu kopiju fajla ili projekta. Korisnik onda radi paralelno menjajući svoju privatnu kopiju. Na kraju, privatna kopija se stopi u novu finalnu verziju. Sistem kontrole verzija često je pomognut stapanjem ali izvršno je čovek odgovoran da se to uradi korektno.

Evo primera. Recimo da Hari i Sali kreiraju radne kopije istog projekta, kopiranjem iz spremišta. Oni rade istovremeno, i prave izmene na istom fajlu A u okviru svojih kopija. Sali sačuva svoje izmene u spremište prva. Kada Hari pokuša da sačuva svoje izmene kasnije, spremište ga informiše da je njegov fajl A zastareo. Drugim rečima, fajl A u spremištu ima nečije izmene od zadnjeg kopiranja. Tako Hari pita svog klijenta da stopi bilo koje nove izmene iz spremišta u njegovu radnu kopiju fajla A. Postoji šansa da Saline izmene ne prekrivaju njegove; tako da će imati oba skupa izmena integrisano, on sačuva svoju radnu kopiju nazad u spremište.

Slika 2.4. Kopiraj-Menjaj-Stopi rešenje

Kopiraj-Menjaj-Stopi rešenje

Slika 2.5. ...Kopiraj-Menjaj-Stopi nastavak

...Kopiraj-Menjaj-Stopi nastavak

Ali šta ako Saline izmene prekrivaju Harijeve izmene? Šta tada? Ova situacija se zove konflikt, i to obično nije veliki problem. Kada Hari traži od svog klijenta da stopi zadnje izmene u spremištu u njegovu radnu kopiju, njegova kopija fajla A je nekako označena da je u stanju konflikta: on će biti u mogućnosti da vidi oba skupa konfliktnih izmena, i ručno da izabere između njih. Primetimo da softver ne može automatski da reši konflikt; samo ljudi su sposobni da razumeju i urade neophodne inteligentne izbore. Jednom kad Hari ručno reši preklapanje izmena (možda diskusijom konflikta sa Sali!), on može bezbedno da sačuva stopljen fajl nazad u spremište.

Kopiraj-menjaj-stopi model može da zvuči pomalo haotično, ali u praksi, radi ekstremno glatko. Korisnici mogu da rade paralelno, nikada ne čekaju jedan drugog. Kada rade na istim fajlovima isključeno je da njihove istovremene izmene ne budu upisane; konflikti su retki. I iznos vremena uzet za rešavanje konflikta je manji od vremena izgubljenog zaključavanjem sistema.

Na kraju, sve dolazi u jedan kritičan faktor: korisnička komunikacija. Kada je loša komunikacija između korisnika sintaksni i semantički konflikti rastu. Nema sistema koji će naterati korisnike da komuniciraju perfektno, i nema sistema koji može da detektuje semantički konflikt. Tako da nije poenta da se bude umiren lažnim obećanjem da sistem zaključavanja nekako predupređuje konflikt; u praksi, zaključavanje izgleda sprečava više produktivnost nego bilo šta drugo.

Postoji jedna obična situacija gde je zaključaj-menjaj-otključaj model bolji, i to gde imate nestopive fajlove. Na primer ako vaše spremište sadrži neke grafičke slike, i dva čoveka menjaju slike u isto vreme, nema načina da se te izmene spoje zajedno. Ili Hari ili Sali će izgubiti svoje izmene.

Šta Subverzija radi?

Subverzija koristi kopiraj-izmeni-stopi rešenje podrazumevano, i u mnogim slučajevima ovo je sve što vam je potrebno. Međutim, od Verzije 1.2 Subverzija takođe podržava zaključavanje fajlova, tako da ako imate nestopive fajlove, ili ako jednostavno forsirate politiku zaključavanja preko uprave, Subverzija će još omogućavati željene osobine.