Github byl spuštěn v roce 2008. Pokud váš software engineering kariéry, jako je ta moje, ani starší než Github, pak Git může být pouze verze ovládacího software jste někdy používali. Zatímco lidé někdy tetřevi o jeho strmé křivce učení nebonintuitivní rozhraní, Git se stal každým go-to pro správu verzí. InStack Přetečení 2015 developer průzkum, 69,3% respondentů používá Git, almosttwice jako mnoho, jak je použit druhý-nejvíce-populární systém pro správu verzí Subversion.1 Po roce 2015 se Stack Overflow přestal ptát vývojářů na systémy řízení verzí, které používají, snad proto, že se Git stal tak populárním, že otázka byla nezajímavá.
Git sám o sobě není o moc starší než Github. Linus Torvalds vydal prvníverze Git v roce 2005. I když dnes mladší vývojáři by mít pevný timeconceiving světa, kde termín „version control software“ nechtěl více orless jen říct, Git, takový svět existuje, není to tak dávno. Na výběr bylo spousta alternativ. Open source vývojáři přednost Subversion,podniky a video herní společnosti používá Perforce (někteří ještě dělat), zatímco theLinux jádro projektu skvěle spoléhali na systém kontroly verzí calledBitKeeper.
některé z těchto systémů, zejména BitKeeper, se mohou cítit povědomé pro mladého uživatele přepravovaného zpět v čase. Většina by to neudělala. BitKeeper stranou, versioncontrol systémy, které přišly před Git pracoval podle fundamentallydifferent paradigma. V taxonomii nabízených Eric Umyvadlo, autor VersionControl Příkladem, Git je třetí generace verze kontrolní systém, whilemost Git předchůdců, systémy populární v roce 1990 a brzy 2000s,jsou druhé generace, systémy pro správu verzí.2 tam, kde jsou distribuovány systémy řízení verzí třetí generace, jsou centralizovány systémy řízení verzí druhé generace. Téměř jistě jste již slyšeli, že Git je popsán jako“ distribuovaný “ systém pro správu verzí. Nikdy jsem nepochopil, thedistributed/centralizované rozdíl, alespoň ne, dokud jsem si nainstaloval andexperimented s centralizovaným druhé generace verze ovládání systemmyself.
systém, který jsem nainstaloval, byl CVS. CVS, zkratka pro systém souběžných verzí, bylprvní systém pro správu verzí druhé generace. To bylo také nejvícepopulární systém pro správu verzí asi deset let, dokud nebyl nahrazen v roce 2000 Subversion. I tehdy měla být Subversion „životopisy, ale lepší“, což jen podtrhuje, jak dominantní se životopisy staly v průběhu 90.let.
CVS byl nejprve vyvinut v roce 1986 holandský počítačový vědec jménem Dick Grune,který hledal způsob, jak spolupracovat se svými studenty na compilerproject.3 CVS byl zpočátku o něco více než sbírka shell scriptswrapping RCS (Revision Control System), Systém řízení verzí první generace, který chtěl Grune vylepšit. RCS pracuje podle pesimistickéhomodel blokování, což znamená, že dva programátoři nemohou pracovat na jednom souboru najednou. Chcete-li upravit soubor, musíte nejprve požádat RCS pro exkluzivní lockon souboru, který budete mít, dokud jste dokončili úpravy. Pokud je někdo jinýjiž upravujete soubor, který potřebujete upravit, musíte počkat. CVS se zlepšily na RCSand ohlašoval druhou generaci systémů pro správu verzí obchodováním s pesimistickým uzamykacím modelem za optimistický. Programátoři nyní mohli editovat stejný soubor ve stejnou dobu, sloučení jejich úpravy a řešení případných konfliktůpozději. (Brian Berliner, inženýr, který později převzal projekt CVS, napsal v roce 1990 velmi čitelný dokument o inovacích CVS.)
v tomto smyslu se CVS příliš nelišily od Git, což také funguje podle optimistického modelu. Ale tam podobnosti končí. Ve skutečnosti, když Linus Torvalds vyvíjel Git, jedním z jeho hlavních principů bylo wwcvsnd, nebo “ co by CVS neudělal.“Kdykoli měl pochybnosti o rozhodnutí, snažil se vybrat možnost, která nebyla vybrána v návrhucv.4 takže i když CVS předchází Git o více než deset let, ovlivnilo to Git jako druh negativní šablony.
opravdu jsem si užil hraní s CVS. Myslím, že neexistuje lepší způsob, jak pochopit, proč je distribuovaná povaha Gitu takovým zlepšením toho, co přišlo dříve. Takže vás vyzývám, abyste se mnou šli na vzrušující cestu a strávili příštích deset minut svého života učením se o kousku softwarunikdo použil v posledním desetiletí. (Viz oprava.)
Začínáme s CVS
pokyny pro instalaci CVS naleznete na stránce projektu. V systému MacOS můžete nainstalovat CVS pomocíhomebrew.
vzhledem k tomu, že CVS je centralizován, rozlišuje mezi vesmírem na straně klienta a vesmírem na straně serveru způsobem, který něco jako Git nemá. Arozlišení není tak výrazné, že existují různé spustitelné soubory. Ale abyste mohli začít používat CVS, a to i na vašem vlastním počítači, budete muset nastavit backend CVs.
backend CVS, centrální úložiště pro celý váš kód, se nazývá repozitář.Zatímco v Gitu byste měli obvykle repozitář pro každý projekt, v CVSthe repozitář obsahuje všechny vaše projekty. Existuje jedno centrální repozitářvšechno, i když existují způsoby, jak pracovat pouze s projektem najednou.
Chcete-li vytvořit místní úložiště, spusťte příkaz init
. Udělali byste to někde globálně, jako je váš domovský adresář.
$ cvs -d ~/sandbox init
CVS umožňuje projít možnosti, buď cvs
příkaz sám, nebo doinit
dílčí příkaz. Možnosti, které se zobrazí po cvs
příkaz jsou globální v přírodě, zatímco možnosti, které se objeví po příkazy jsou specifické pro thesubcommand. V tomto případě je příznak -d
globální. Tady se to stane, řekněte CVSwhere chceme vytvořit naše úložiště, ale obecně -d
vlajky bodů na umístění úložiště chceme použít pro danou akci. To může betedious k napájení -d
vlajky celou dobu, takže CVSROOT
environmentvariable lze nastavit místo.
protože pracujeme lokálně, právě jsme prošli cestu pro náš -d
argument, ale mohli jsme také zahrnout název hostitele.
příkaz vytvoří adresář s názvem sandbox
ve vašem domovském adresáři. Pokud vypíšete obsah sandbox
, zjistíte, že obsahuje jiný directorycalled CVSROOT
. Tento adresář, nesmí být zaměňován s prostředímvariable, obsahuje administrativní soubory pro úložiště.
Gratulujeme! Právě jste vytvořili svůj první CVS repozitář.
kontrola kódu
řekněme, že jste se rozhodli ponechat si seznam svých oblíbených barev. Jste umělecky nakloněný, ale nesmírně zapomnětlivý člověk. Zadejte svůj seznam barev a uložit jej jako soubor s názvem favorites.txt
:
blueorangegreendefinitely not yellow
Pojďme se také předpokládat, že jste uložili soubor do nového adresáře s názvemcolors
. Nyní byste chtěli dát svůj oblíbený seznam barev pod kontrolu verzí, protože za padesát let bude zajímavé podívat se zpět a zjistit, jakváš vkus se časem změnil.
za tímto účelem budete muset importovat adresář jako nový CVSproject. Můžete to udělat pomocí příkazu import
:
$ cvs -d ~/sandbox import -m "" colors colors initialN colors/favorites.txtNo conflicts created by this import
Tady se zadáním umístění našeho repozitáře s -d
flagagain. Zbývající argumenty jsou předány podkapitole import
. Máme zprávu, ale tady ji opravdu nepotřebujeme, tak jsme ji nechali na pokoji. Další argument, colors
, určuje název našeho nového adresáře v úložišti; tady jsme jen použít stejné jméno jako adresář.Poslední dva argumenty určují značku dodavatele a značku vydání.Za minutu si promluvíme o značkách.
právě jste stáhli svůj projekt „barvy“ do úložiště CVS. Existuje několik různých způsobů, jak jít o uvedení kódu do CVS, ale to je themethod doporučuje Pragmatický Verzí UsingCVS, PragmaticProgrammer knihu o CVS. Co dělá tuto metodu trochu trapnou, je to, že youthen musí zkontrolovat svou práci čerstvě, i když už máte existující adresář colors
. Místo toho, abyste tento adresář používali, budete jej vymazat a pak se podívejte na verzi, o které CVS již ví:
$ cvs -d ~/sandbox co colorscvs checkout: Updating colorsU colors/favorites.txt
tím se vytvoří nový adresář, také volal colors
. V tomto adresáři najdete svůj původní favorites.txt
soubor spolu s adresářem nazvanýmCVS
. Adresář CVS
je v podstatě ekvivalentem adresáře .git
v každém repozitáři Git.
provádění změn
připravte se na cestu.
stejně jako Git, CVS mástatus
dílčí příkaz:
to je místo, kde věci začínají vypadat cizí. CVS nemá objekty odevzdání. V výše, tam je něco, co nazývá „Odevzdání Identifikátor,“ ale to může býtpouze tehdy relativně nedávné vydání—žádná zmínka o „Spáchání Identifikátor“ se objeví inPragmatic Řízení Verzí Pomocí CVS, který byl publikován v roce 2003. (Lastupdate na CVS byla vydána v 2008.5)
Vzhledem k tomu, že s Git byste mluvit o verzi souboru spojené s commit45de392
v CVS soubory jsou v adresářích samostatně. První verze yourfile je verze 1.1, další verze je 1.2 a tak dále. Když větve areinvolved, navíc čísla jsou připojeny, takže můžete skončit s něčím jako 1.1.1.1
výše, což se zdá být výchozí v našem případě, i když wehaven nevytvořili žádné větve.
Pokud jste se spustit cvs log
(ekvivalent git log
) v projektu s lotsof soubory a zavazuje se, viděla bys individuální historie pro každý soubor. Můžete mít soubor ve verzi 1.2 a soubor ve verzi 1.14 ve stejném projektu.
pojďme do toho a provedeme změnu na verzi 1.1 našeho souboru favorites.txt
:
blue orange green+cyan definitely not yellow
Poté, co jsme udělali změnu, můžeme spustit cvs diff
vidět, co CVS si myslí, že jsme udělal:
CVS uznává, že jsme přidali nový řádek obsahující barvu „cyan“ do souboru. (Ve skutečnosti se říká, že jsme provedli změny v souboru „RCS“; můžete vidět, že CVS nikdy zcela neunikly původnímu spojení s RCS.) Rozdíl, který zobrazujeme, je rozdíl mezi kopií favorites.txt
v našem workingdirectory a verzí 1.1.1.1 uloženou v úložišti.
abychom mohli aktualizovat verzi uloženou v úložišti, musíme provést změnu. V Gitu by to byl vícestupňový proces. Museli bychom to naaranžovat tak, aby se to objevilo v našem indexu. Pak bychom se dopustili změny. A konečně, aby byla změna viditelná pro kohokoli jiného, museli bychom posunout commit až do původního úložiště.
v CVS se všechny tyto věci dějí při spuštění cvs commit
. CVS justbundles všechny změny, které může najít, a vloží je do úložiště:
jsem tak zvyklý na Git, že mi to připadá děsivé. Bez, jak fázi změny, jakékoli staré věci, které jsem se dotkl v pracovní directorymight skončit jako součást veřejné úložiště. Jste pasivní-aggressivelyrewrite spolupracovník je špatně implementována funkce z očistné nutností,nikdy v úmyslu, aby to věděl? Škoda, teď si myslí, že jsi kokot. Také nemůžete upravit své commity před jejich tlačením, protože commit je push. Myslíte si, že strávíte 40 minut opakovaným spuštěním git rebase -i
, dokud vaše historie localcommit neproudí jako odvození matematického důkazu? Promiňte, to tady nemůžete udělat, a všichni zjistí, že ve skutečnosti nepíšete své testy jako první.
ale také nyní chápu, proč tolik lidí považuje Git za zbytečně komplikovaný.Pokud cvs commit
je to, co jste byli zvyklí, pak jsem si jistý, že inscenace a pushingchanges by stávka vás jako zbytečné fuška.
Když lidé mluví o tom, že Git je „distribuovaný“ systém, je to především rozdíl, který mají na mysli. V CVS nemůžete provádět commity lokálně. Commit je jako předání kódu do centrálního úložiště, takže to není něco, co můžete udělat bez připojení. Jediné, co máte Lokálně, je Váš pracovní adresář. V Gitu máte plnohodnotný lokální repozitář, takže můžete provádět commit po celý den, i když je odpojen. A můžete upravit tyto commits, revert, branch, andcherry vybrat tolik, kolik chcete, aniž by někdo jiný musel vědět.
vzhledem k tomu, že commit byl větší problém, uživatelé CVS je často dělali jen zřídka.Commity by obsahovaly tolik změn, kolik dnes můžeme očekávat v Aten-commit pull request. To platilo zejména v případě, že commity spustily CIbuild a automatizovanou testovací sadu.
Když jsme nyní spustit cvs status
, můžeme vidět, že se máme novou verzi našeho souboru:
Sloučení
Jak bylo uvedeno výše, v CVS můžete upravit soubor, který je někdo jiný alreadyediting. To bylo velké zlepšení CVS na RCS. Co se stane, když potřebujetepřinést své změny zpět dohromady?
řekněme, že jste pozvali některé přátele, aby přidali své oblíbené barvyváš seznam. Zatímco přidávají své barvy, rozhodnete se, že už nejsoujako zelená barva a odstraňte ji ze seznamu.
Když jdete spáchat změny, možná zjistíte, že CVS upozornění problém:
vypadá To, že tví přátelé spáchali jejich změny první. Takže vaše verzefavorites.txt
není aktuální s verzí v úložišti. Pokud yourun cvs status
, uvidíte, že vaše místní kopie favorites.txt
version1.2 s některými místními změny, ale úložiště verze je 1.3:
můžete spustit cvs diff
přesně vidět, jaké rozdíly mezi 1.2 and1.3 jsou:
zdá se, že naši přátelé opravdu ráda růžovou. V každém případě upraviliodlišné části souboru, než máme my, takže změny lze snadno sloučit. CVScan udělat za nás, když jsme se spustit cvs update
, který je podobný git pull
:
$ cvs updatecvs update: Updating .RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,vretrieving revision 1.2retrieving revision 1.3Merging differences between 1.2 and 1.3 into favorites.txtM favorites.txt
Pokud jste se teď podívat na favorites.txt
, zjistíte, že to má beenmodified zahrnout změny, které vaše přátele provedené v souboru. Vaše změny jsou stále tam taky. Nyní můžete soubor odevzdat:
konečný výsledek je to, co byste dostali v Gitu spuštěním git pull --rebase
. Yourchanges byly přidány na vrcholu změn vašich přátel. Neexistuje žádný “ mergecommit.“
někdy mohou být změny ve stejném souboru nekompatibilní. Pokud by vaši přátelé například změnili „zelenou“ na „Olivovou“, bylo by to v rozporu s tím, že by vaše výměna úplně odstranila „zelenou“. V prvních dnech CVS, to bylo přesně to, co způsobilo, že se lidé obávali, že CVS není bezpečné; Pesimistické zamykání RCS zajistilo, že takový případ nikdy nemůže nastat. CVs však zaručuje bezpečnost tím, že zajistí, aby se změny nikdo nepřepsal automaticky. Musíte říct CVS, kterou změnu chcete zachovat, takže když spustíte cvs update
, CVS označí soubor s oběma changesin stejným způsobem jako Git dělá, když git detekuje konflikt sloučení. Poté musíte ručně upravit soubor a vybrat změnu, kterou chcete zachovat.
zde je zajímavé poznamenat, že konflikty sloučení musí být opraveny, než budete moci odevzdat. To je další důsledek CVS‘ centralizovanou povahu.V systému Git, nemusíte se obávat řešení splývá, až budete tlačit thecommits máte lokálně.
Tagy a Větve
Od CVS nemá jednoduše adresovatelné spáchat objekty, jediný způsob, jak groupa sbírka změny je označit konkrétní stav pracovního adresáře s atag.
Vytvoření tagu je jednoduché:
$ cvs tag VERSION_1_0cvs tag: Tagging .T favorites.txt
Budete později moci vrátit soubory do tohoto stavu spuštěním cvs update
andpassing tag -r
vlajky:
$ cvs update -r VERSION_1_0cvs update: Updating .U favorites.txt
Protože budete potřebovat tag přetočit na dřívější stav pracovního adresáře, CVSencourages hodně preventivní označování. Před hlavní refactors, například,můžete vytvořit BEFORE_REFACTOR_01
tag, který můžete později použít, pokud therefactor pokazilo. Lidé také používali značky, pokud chtěli generovatprojektové rozdíly. V podstatě, všechny věci, které dnes běžně děláme s commithashes, je třeba předvídat a plánovat s CVS, protože jste již potřebovali mít značky k dispozici.
větve mohou být vytvořeny v CVS, tak nějak. Větve jsou jen zvláštní druh oftag:
$ cvs rtag -b TRY_EXPERIMENTAL_THING colorscvs rtag: Tagging colors
vytváří pouze pobočku (v plném pohledu na každého, mimochodem), tak youstill třeba přepínat pomocí cvs update
:
$ cvs update -r TRY_EXPERIMENTAL_THING
výše uvedené příkazy přepnout na novou větev do vaší aktuální workingdirectory, ale Pragmatický Řízení Verzí Pomocí CVS vlastně radí, že youcreate nového adresáře, aby držet své nové pobočky. Pravděpodobně jeho autoři nalezlipřepínání adresářů jednodušší než přepínání větví v CVS.
pragmatická Správa verzí pomocí CVS také nedoporučuje vytvářet větve existující větve. Doporučují pouze vytvářet větve mimo hlavní větev, která je v Gitu známá jako master
. Obecně bylo větvenípovažována za“ pokročilou “ dovednost CVS. V Git, můžete začít novou pobočku foralmost nějaké triviální důvod, ale v CVS větvení byl obvykle používá pouze whenreally nezbytné, například pro zprávy.
pobočka by mohla být později sloučeny zpět do mainline pomocí cvs update
a -j
vlajky:
$ cvs update -j TRY_EXPERIMENTAL_THING
Díky za Spáchat Historie
V roce 2007, Linus Torvalds dal mluvíme o Git na Google. Git byl tehdy velmi nový, takže diskuse byla v podstatě pokusem přesvědčit místnost skeptických programátorů, že by měli používat Git, i když Git byl takodlišný od všeho, co bylo tehdy k dispozici. Pokud jste ještě neviděli řeč, Ihighly doporučujeme, abyste se na ni dívali. Linus je zábavný řečník, i když onnikdy nedokáže být jeho drzým já. Dělá vynikající práci, když vysvětluje pročdistribuovaný model správy verzí je lepší než centralizovaný. Hodně jeho kritiky je vyhrazeno zejména pro životopisy.
Git je komplexní nástroj. Naučit se to může být vzrušující zážitek. Ale také jsem neustále ohromen věcmi, které Gitcan dělá. V porovnání, CVS je jednoduchý a přímočarý, i když často neschopné dělat mnoho operací, které nyní považujeme za samozřejmost. Návrat a používání Cvsfo chvíli je vynikající způsob, jak se ocitnout s novým oceněním forgitovy síly a flexibility. To dobře ilustruje, proč pochopení adresu dějin vývoje softwaru může být tak prospěšné—picking up a re-examiningobsolete nástroje, vás naučí, objemy, proč za nástroje, které jsme usetoday.
Pokud se vám tento příspěvek líbil, spíš to vyjde každé čtyři týdny! Sledujte @TwoBitHistory na Twitteru nebo se přihlaste k odběru RSS feedabyste se ujistili, že víte, kdy je nový příspěvek venku.
Oprava
bylo mi řečeno, že existuje mnoho organizací, zejména riziko-adverseorganizations, že dělat věci, jako je make medical device software, které stále useCVS. Programátoři v těchto organizacích vyvinuli malé triky pro práci kolem omezení CVS, jako je vytvoření nové větve pro téměř everybody, aby se zabránilo spáchání přímo na HEAD
. (Díky Michaelu Kohnovi za to, že to zjistil.)