0b10

Github blev lanceret i 2008. Hvis din ingeniørkarriere, som min, ikke er ældre end Github, så er Git muligvis det eneste versionsstyringsprogram, du nogensinde har brugt. Mens folk undertiden ryper om sin stejle indlæringskurve ellerunintuitive grænseflade, er Git blevet alles go-to til versionskontrol. InStack overløbs udviklerundersøgelse fra 2015, 69,3% af de adspurgte brugte Git,næsten to gange så mange som brugte det næstmest populære versionskontrolsystem, Subversion.1 efter 2015 stoppede Stack overløb med at spørge udviklere omversion kontrolsystemer, de bruger, måske fordi Git var blevet så populærtat spørgsmålet var uinteressant.

Git selv er ikke meget ældre end Github. Linus Torvalds udgav den førsteversion af Git i 2005. Selvom yngre udviklere i dag måske har svært ved at forestille sig en verden, hvor udtrykket “versionsstyringsprogram” ikke mere eller mindre bare betød Git, eksisterede en sådan verden ikke så længe siden. Der var mange alternativer at vælge imellem. Open source-udviklere foretrak Subversion, virksomheder og videospilfirmaer brugte Perforce (nogle gør det stadig), mens kernel-projektet berømt påberåbte sig et versionskontrolsystem kaldetbitkeeper.

Nogle af disse systemer, især BitKeeper, kan føle sig bekendt med en youngGit-bruger, der transporteres tilbage i tiden. De fleste ville ikke. BitKeeper til side, versioncontrolsystemerne, der kom før Git, fungerede efter et fundamentalt andet paradigme. I en taksonomi, der tilbydes af Eric Sink, forfatter af VersionControl ved eksempel, Git er et tredje generations versionskontrolsystem, mensde fleste af Gits Forgængere,de systemer, der var populære i 1990 ‘erne og begyndelsen af 2000’ erne, er andengenerations versionskontrolsystemer.2 Hvor tredje generationversion kontrolsystemer distribueres, anden generation version kontrolsystemer er centraliseret. Du har næsten helt sikkert hørt Git beskrevet som et” distribueret ” versionskontrolsystem før. Jeg har aldrig helt forstået dendistribueret / centraliseret skelnen, i det mindste ikke før jeg installerede ogeksperimenteret med et centraliseret anden generations versionskontrolsystemmig selv.

det system, jeg installerede, var CVS. CVS, forkortelse for Concurrent Versions System, varDet allerførste anden generations versionsstyringssystem. Det var også det mest populære versionskontrolsystem i omkring et årti, indtil det blev erstattet i 2000 af Subversion. Selv da skulle Subversion være” CV ‘er men bedre”, hvilket kun understreger, hvor dominerende CV ‘er var blevet gennem 1990’ erne.

CVS blev først udviklet i 1986 af en hollandsk computerforsker ved navn Dick Grune,der ledte efter en måde at samarbejde med sine studerende på et kompilatorprojekt.3 CVS var oprindeligt lidt mere end en samling af shell scriptindpakning RCS (Revision Control System), et første generations versionsstyringssystem, som Grune ønskede at forbedre. RCS fungerer efter en pessimistisklåsning model, hvilket betyder, at ikke to programmører kan arbejde på en enkelt fil atonce. For at redigere en fil skal du først bede RCS om en eksklusiv låsepå filen, som du opbevarer, indtil du er færdig med at redigere. Hvis en anden erredigerer allerede en fil, du skal redigere, Du skal vente. CVS forbedret på Rc ‘ er og indledte anden generation af versionsstyringssystemer ved at handle denpessimistiske låsemodel for en optimistisk. Programmører kunne nu redigere densamme fil på samme tid, fusionere deres redigeringer og løse eventuelle konfliktsenere. (Brian Berliner, en ingeniør, der senere overtog CVs-projektet, skrev et meget læsbart papirom CVs ‘ innovationer i 1990.)

i den forstand var CVS ikke så forskellig fra Git, som også fungererifølge en optimistisk model. Men det er her lighederne slutter. Faktisk, da Linus Torvalds udviklede Git, var et af hans vejledende principper, eller “hvad ville CVS ikke gøre.”Hver gang han var i tvivl om en beslutning,stræbte han efter at vælge den mulighed, der ikke var valgt i designet afcv’ er.4 så selvom CVS går forud for Git med over et årti, påvirkede det Git som en slags negativ skabelon.

Jeg har virkelig nydt at lege med CVS. Jeg tror, at der ikke er nogen bedre måde at forstå, hvorfor Git ‘ s distribuerede natur er sådan en forbedring af, hvad der kom før. Så jeg inviterer dig til at komme sammen med mig på en spændende rejse ogtilbringe de næste ti minutter af dit liv at lære om et stykke programmelingen har brugt i det sidste årti. (Se rettelse.)

Kom godt i gang med CVS

instruktioner til installation af CVS kan findes på project ‘ shomepage. På MacOS kan du installere CVS ved hjælp afhusbryggeri.

da CVS er centraliseret, skelner det mellem klientsideuniverset ogserversideuniverset på en måde, som noget som Git ikke gør. Denkarakter er ikke så udtalt, at der er forskellige eksekverbare filer. Men for at begynde at bruge CVS, selv på din egen maskine, skal du oprette theCVS backend.

CVS-backenden, den centrale butik for al din kode, kaldes depotet.Mens du i Git typisk vil have et lager for hvert projekt, i Cvsopbevaringsstedet indeholder alle dine projekter. Der er et centralt lager forAlt, selvom der kun er måder at arbejde med et projekt ad gangen.

for at oprette et lokalt lager kører du kommandoen init. Du ville gøre detteet sted globalt som din hjemmekatalog.

$ cvs -d ~/sandbox init

CVS giver dig mulighed for at videregive indstillinger til entencvs kommandoen selv eller tilinit underkommando. Indstillinger, der vises efter kommandoen cvs er globale inatur, mens indstillinger, der vises efter underkommandoen, er specifikke forunderkommandoen. I dette tilfælde er -d flag global. Her sker det at fortælle Cvshvor vi vil oprette vores lager, men generelt -d flag peger påplaceringen af det lager, vi vil bruge til en given handling. Det kan betedious at levere-d flag hele tiden, såCVSROOT environmentvariable kan indstilles i stedet.

da vi arbejder lokalt, har vi lige passeret en sti til vores -d argument,men vi kunne også have inkluderet et værtsnavn.

kommandoen opretter en mappe kaldetsandbox i din hjemmemappe. Hvis duliste indholdet af sandbox, vil du opdage, at det indeholder en anden direktørkaldet CVSROOT. Denne mappe, ikke at forveksle med miljøetvariabel, indeholder administrative filer til lageret.

Tillykke! Du har lige oprettet dit første CVs-arkiv.

kontrol af kode

lad os sige, at du har besluttet at føre en liste over dine yndlingsfarver. Du er en kunstnerisk tilbøjelig, men ekstremt glemsom person. Du skriver din listof farver og gemme det som en fil kaldet favorites.txt:

blueorangegreendefinitely not yellow

lad os også antage, at du har gemt din fil i en ny mappe kaldetcolors. Nu vil du gerne sætte din yndlingsfarveliste under versionskontrol,for halvtreds år fra nu vil det være interessant at se tilbage og se hvordandin smag ændrede sig gennem tiden.

for at gøre det skal du importere din mappe som et nyt Cvsprojekt. Du kan gøre det ved hjælp af kommandoenimport :

$ cvs -d ~/sandbox import -m "" colors colors initialN colors/favorites.txtNo conflicts created by this import

Her specificerer vi placeringen af vores lager med-d flagagain. De resterende argumenter sendes tilimport underkommando. Vi Harat give en besked, men her har vi ikke rigtig brug for en, så vi har forladt detblank. Det næste argument, colors, angiver navnet på vores nye mappe i repository; her har vi lige brugt det samme navn som den mappe, vi er i.De sidste to argumenter angiver henholdsvis vendor-tag og release-tag.Vi snakker mere om tags om et øjeblik.

du har lige trukket dit “farver” – projekt ind i CVs-arkivet. Der er et par forskellige måder at gå om at bringe kode i CVS, men dette er den metode anbefales af Pragmatic Version Control UsingCVS, den PragmaticProgrammer bog om CVS. Hvad der gør denne metode lidt akavet er, at duderefter skal du tjekke dit arbejde frisk, selvom du allerede har en eksisterende colors directory. I stedet for at bruge den mappe, skal du slette den og derefter tjekke den version, som CVS allerede kender til:

$ cvs -d ~/sandbox co colorscvs checkout: Updating colorsU colors/favorites.txt

dette vil oprette en ny mappe, også kaldetcolors. I denne mappe finder du din originalefavorites.txt fil sammen med en mappe kaldetCVSCVS mappen er dybest set CVS’ ækvivalent med.git directoryin hvert Git-lager.

Foretag ændringer

gør dig klar til en tur.

ligesom Git har CVS enstatus subcommand:

det er her ting begynder at se fremmede ud. CVS har ikke begå objekter. Iovenstående er der noget, der hedder en “Commit Identifier”, men det kan kun værekun en relativt ny udgave—Ingen omtale af en “Commit Identifier” vises ipragmatisk versionskontrol ved hjælp af CVS, som blev offentliggjort i 2003. (Den lastupdate til CVS blev udgivet i 2008.5)

mens du med Git ville tale om versionen af en fil, der er knyttet til commit45de392, i CVS-filer versioneres separat. Den første version af yourfile er version 1.1, den næste version er 1.2, og så videre. Når filialer erinvolveret, tilføjes ekstra tal, så du kan ende med noget som 1.1.1.1 ovenfor, hvilket synes at være standard i vores tilfælde, selvom Vihar ikke oprettet nogen grene.

Hvis du skulle køre cvs log (svarende til git log) i et projekt med lotsof filer og forpligter, ville du se en individuel historie for hver fil. Du har muligvis en fil i version 1.2 og en fil i version 1.14 i det samme projekt.

lad os gå videre og foretage en ændring til version 1.1 af vores favorites.txt fil:

 blue orange green+cyan definitely not yellow

Når vi har foretaget ændringen, kan vi kørecvs diff for at se, hvad CVS mener, at vi har gjort:

CVS anerkender, at vi tilføjede en ny linje, der indeholder farven “cyan” tilfil. (Faktisk siger det, at vi har foretaget ændringer i “RCS” – filen; du kan se, atcvs aldrig helt undslap sin oprindelige tilknytning til RCS.) Den diff, vi bliver vist, er diff mellem kopien af favorites.txt i vores Arbejdsdirektorat og 1.1.1.1-versionen, der er gemt i lageret.

for at opdatere den version, der er gemt i depotet, skal vi begåændring. I Git ville dette være en multi-trins proces. Vi bliver nødt til at iscenesætte ændringen, så den vises i vores indeks. Så ville vi begå ændringen. Endelig, for at gøre ændringen synlig for nogen anden, bliver vi nødt til at skubbe forpligtelsen op til origin repository.

i CVS sker alle disse ting, når du kører cvs commit. CVS justbundles op alle de ændringer, den kan finde og sætter dem i depotet:

Jeg er så vant til at Git, at dette slår mig som skræmmende. Uden en mulighedat iscenesætte ændringer, enhver gammel ting, du har rørt i din arbejdsdirektørkunne ende som en del af det offentlige arkiv. Har du passivt-aggressivtomskrive en kollegas dårligt implementerede funktion ud af katartisk nødvendighed,aldrig til hensigt for ham at vide? Ærgerligt, han nu tror du er en pik. Du kan heller ikke redigere dine forpligtelser, før du skubber dem, da en forpligtelse er et skub. Nyder du at bruge 40 minutter gentagne gange på at køre git rebase -i, indtil din localcommit-historie flyder som afledningen af et matematisk bevis? Beklager, du kan ikke gøre det her, og alle vil finde ud af, at du ikke rent faktisk skriver dine tests først.

men jeg forstår også nu, hvorfor så mange mennesker finder Git unødvendigt kompliceret.Hvis cvs commit er det, du var vant til, så er jeg sikker på at iscenesættelse og pushingchanges ville slå dig som en meningsløs opgave.

når folk taler om, at Git er et “distribueret” system, er det først og fremmest forskellen de betyder. I CVS kan du ikke lave forpligtelser lokalt. En forpligtelse er somindsendelse af kode til det centrale lager, så det er ikke noget, du kan gøreuden en forbindelse. Alt du har lokalt er din arbejdsmappe. I Git har du et fuldt udbygget lokalt lager, så du kan lave forpligtelser hele dagen langselv mens du er afbrudt. Og du kan redigere disse forpligtelser, vende tilbage, gren, andcherry vælge så meget som du vil, uden at nogen andre behøver at vide.

da forpligtelser var en større aftale, lavede CVs-brugere dem ofte sjældent.Forpligtelser vil indeholde så mange ændringer, som vi i dag kunne forvente at se i Aten-commit pull-anmodning. Dette var især tilfældet, hvis commits udløste en CIbuild og en automatiseret test suite.

Hvis vi nu kører cvs status, kan vi se, at vi har en ny version af vores fil:

fletning

som nævnt ovenfor kan du i CVS redigere en fil, som en anden allerede erredigering. Det var CVS ‘ store forbedring på RCS. Hvad sker der, når du skal bringe dine ændringer sammen igen?lad os sige, at du har inviteret nogle venner til at tilføje deres yndlingsfarver tildin liste. Mens de tilføjer deres farver, beslutter du, at du ikke længereligesom farven grøn og fjern den fra listen.

når du går til at begå dine ændringer, kan du opdage, at CVS bemærker aproblem:

det ser ud til, at dine venner har begået deres ændringer først. Så din version affavorites.txt er ikke opdateret med versionen i depotet. Hvis yourun cvs status, vil du se, at din lokale kopi af favorites.txt er version1. 2 med nogle lokale ændringer, men repository-versionen er 1.3:

Du kan køre cvs diff for at se præcis, hvad forskellene mellem 1,2 og1.3 er:

det ser ud til, at vores venner virkelig kan lide pink. Under alle omstændigheder har de redigeret en anden del af filen, end vi har, så ændringerne er lette at flette. CVScan gøre det for os, når vi kører cvs update, som ligner 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

Hvis du nu kigger påfavorites.txt, vil du opdage, at det er blevet ændret til at omfatte de ændringer, som dine venner har foretaget i filen. Dine ændringer er der stadig også. Nu er du fri til at begå filen:

slutresultatet er, hvad du får i Git ved at køre git pull --rebase. Yourchanges er blevet tilføjet oven på dine venners ændringer. Der er ingen ” mergecommit.”

nogle gange kan ændringer i den samme fil være uforenelige. Hvis dine venner havde ændret “grøn” til “oliven”, for eksempel, ville det have været i konflikt med dinændring, der fjerner “grøn” helt. I de tidlige dage af CVS, dette var nøjagtigt den slags sag, der fik folk til at bekymre sig om, at CVS ikke var sikkert; RCS ‘ pessimistisk låsning sikrede, at en sådan sag aldrig kunne opstå. Men Cvsgaranterer sikkerhed ved at sikre, at ingen ændringer bliver overskrivetautomatisk. Du skal fortælle CVS, hvilken ændring du vil fortsætte fremad, så når du kører cvs update, markerer CVS filen med begge ændringerpå samme måde som Git gør, når Git registrerer en fletningskonflikt. Derefter skal du manuelt redigere filen og vælge den ændring, du vil beholde.

det interessante at bemærke her er, at fusionskonflikter skal rettes, før du kan begå. Dette er en anden konsekvens af CVs ‘ centraliserede nature.In Git, du behøver ikke bekymre dig om at løse fusioner, før du skubber de forpligtelser, du har lokalt.

Tags og filialer

da CVS ikke har let adresserbare commit-objekter, er den eneste måde at gruppere en samling af ændringer på at markere en bestemt arbejdsmappetilstand med atag.

oprettelse af et tag er let:

$ cvs tag VERSION_1_0cvs tag: Tagging .T favorites.txt

Du kan senere returnere filer til denne tilstand ved at køre cvs update ogpasserer tagget til -r flag:

$ cvs update -r VERSION_1_0cvs update: Updating .U favorites.txt

fordi du har brug for et tag for at spole tilbage til en tidligere arbejdsmappe tilstand, Cvsencourges en masse forebyggende tagging. Før major refactors kan du for eksempel oprette et BEFORE_REFACTOR_01 tag, som du senere kunne bruge,hvis thefactor gik galt. Folk brugte også tags, hvis de ønskede at generereprojektdækkende diffs. I bund og grund, alle de ting, vi rutinemæssigt gør i dag med commithashes, skal forventes og planlægges med CVS, da du allerede havde brug for at have de tilgængelige tags.

filialer kan oprettes i CVS, slags. Brancher er bare en speciel slagtag:

$ cvs rtag -b TRY_EXPERIMENTAL_THING colorscvs rtag: Tagging colors

det skaber kun filialen (i fuld visning af alle, forresten), så duskal stadig skifte til det ved hjælp afcvs update:

$ cvs update -r TRY_EXPERIMENTAL_THING

ovenstående kommandoer skifter til den nye filial i din nuværende arbejdermappe, men pragmatisk versionskontrol ved hjælp af CVs anbefaler faktisk, at duOpret en ny mappe til at holde din nye filial. Formentlig fandt forfatterne detskifte mapper lettere end at skifte filialer i CV ‘ er.

pragmatisk versionskontrol ved hjælp af CVS fraråder også at oprette filialer af en eksisterende filial. De anbefaler kun at oprette grene ud afmainline gren, som i Git er kendt som master. Generelt var forgreningbetragtes som en” avanceret ” CVs-færdighed. I Git kan du starte en ny filial fornæsten enhver triviel grund, men i CVs blev forgrening typisk kun brugt, når det virkelig var nødvendigt, f.eks.

en gren kunne senere flettes tilbage til hovedlinjen ved hjælp af cvs update og -j flag:

$ cvs update -j TRY_EXPERIMENTAL_THING

tak for de begå historier

i 2007, Linus Torvalds gav atalk om Git på Google. Git var meget ny dengang, så foredraget var dybest set et forsøg på at overtale en rumfuld afskeptiske programmører, at de skulle bruge Git, selvom Git var så forskellig fra alt, hvad der var tilgængeligt. Hvis du ikke allerede har set foredraget, ihighly opfordre dig til at se det. Linus er en underholdende højttaler, selvom hanaldrig undlader at være hans brash selv. Han gør et fremragende stykke arbejde med at forklare hvorforden distribuerede model af versionskontrol er bedre end den centraliserede. Meget af hans kritik er især forbeholdt CVS.

Git er et komplekst værktøj. At lære det kan være spændende oplevelse. Men jeg er også konstant forbløffet over de ting, som Gitcan gør. Til sammenligning, CVS er enkel og ligetil, men ofte unableto gøre mange af de operationer, vi nu tager for givet. At gå tilbage og bruge Cvsi et stykke tid er en glimrende måde at finde dig selv med en ny påskønnelse forgits magt og fleksibilitet. Det illustrerer godt, hvorfor det kan være så gavnligt at forstå programmeludviklingshistoriens historie—at samle op og revurdere forældede værktøjer vil lære dig meget om hvorfor bag de værktøjer, vi bruger i dag.

Hvis du nød dette indlæg, mere som det kommer ud hver fjerde uge! Følg @ Tobithistorie på kvidre eller abonnere på RSS-feedfor at sikre, at du ved, hvornår et nyt indlæg er ude.

korrektion

Jeg har fået at vide, at der er mange organisationer, især risiko-adverseorganisationer, der gør ting som at lave medicinsk udstyr, der stadig brugercv ‘ er. Programmører i disse organisationer har udviklet små tricks tilarbejder omkring CVS ‘ begrænsninger, såsom at lave en ny filial til næsten everychange for at undgå at forpligte sig direkte til HEAD. (Tak til Michael Kohne forpointing dette ud.)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *