Git

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 28 juni 2022; kontroller kräver 6 redigeringar .
git
Sorts distribuerat versionskontrollsystem [d] , öppet vetenskapsverktyg [d] ,verktygsprogramvaraoch filarkiv [d]
Utvecklaren Software Freedom Conservancy [1]
Skrivet i C [4] , UNIX-skal , Perl , Tcl , Python och C++
Operativ system plattformsoberoende
Gränssnittsspråk engelsk
Första upplagan 7 april 2005 [2]
senaste versionen
Läsbara filformat git packfile [d] [5], git packfile index (version 1) [d] [5]och git packfile index (version 2) [d] [5]
Genererade filformat git packfile [d] [5], git packfile index (version 1) [d] [5]och git packfile index (version 2) [d] [5]
Licens GNU GPL 2 [6]
Hemsida git-scm.com
 Mediafiler på Wikimedia Commons

Git (uttalas "git" [7] ) är ett distribuerat versionskontrollsystem . Projektet skapades av Linus Torvalds för att hantera utvecklingen av Linuxkärnan , den första versionen släpptes den 7 april 2005 . Hittills har han stöd av Junio ​​​​Hamano .

Projekt som använder Git inkluderar Linux-kärnan , Swift , Android , Drupal , Cairo , GNU Core Utilities , Mesa , Wine , Chromium , Compiz Fusion , FlightGear , jQuery , PHP , NASM , MediaWiki , DokuWiki , Qt , ett antal Linux- distributioner .

Programmet är gratis och släppt under GNU GPL version 2. Standard är TCP-port 9418.

Historik

Utvecklingen av Linux-kärnan utfördes på det proprietära systemet BitKeeper [8] , som författaren - Larry McVoy , själv Linuxutvecklare - tillhandahöll projektet under en fri licens. Utvecklare, högklassiga programmerare, skrev flera verktyg, och för en, Andrew Tridgell omvänd konstruerade BitKeeper-formatet för dataöverföring. Som svar anklagade McVoy utvecklarna för att ha brutit mot avtalet och återkallade licensen, och Torvalds tog på sig ett nytt system: inget av de öppna systemen tillät tusentals programmerare att samarbeta i sina ansträngningar (samma konflikt ledde till att Mercurial skrevs ). Ideologin var enkel: ta CVS- metoden och vänd den på huvudet [9] , och lägg samtidigt till tillförlitlighet.

Den första utvecklingen tog mindre än en vecka: den 3 april 2005 började utvecklingen och den 7 april hanterades Git-koden av ett oavslutat system. Den 16 juni migrerades Linux till Git och den 25 juli hoppade Torvalds av som huvudutvecklare.

Torvalds var så sarkastisk över sitt val av namnet git (som betyder "skurk" på engelska):

Aquote1.png Jag är en egoistisk jävel, så jag döper alla mina projekt efter mig själv. Först Linux, nu git. Jag är en självisk jävel, och det är därför jag uppkallar alla mina projekt efter mig själv. Först Linux , nu git. Aquote2.png
[10] [11]

Funktioner

Systemet är utformat som en uppsättning program speciellt utformade för användning i scenarier . Detta gör det enkelt att skapa anpassade Git-baserade versionskontrollsystem eller användargränssnitt. Till exempel är Cogito just ett sådant exempel på en wrapper runt Git-repositories, och StGit använder Git för att hantera en samling korrigeringar ( patchar ).

Git stöder snabb versionsdelning och sammanslagning, och inkluderar verktyg för att visualisera och navigera i en icke-linjär utvecklingshistorik. Liksom Darcs , BitKeeper , Mercurial , Bazaar och Monotone , ger Git varje utvecklare en lokal kopia av hela utvecklingshistoriken, ändringar kopieras från ett arkiv till ett annat.

Fjärråtkomst till Git-repositories tillhandahålls av git- demonen , SSH eller HTTP -servern. Git-daemon TCP-tjänsten är en del av Git-distributionen och är tillsammans med SSH den vanligaste och mest pålitliga åtkomstmetoden. HTTP-åtkomstmetoden, trots ett antal begränsningar, är mycket populär i kontrollerade nätverk, eftersom den tillåter användning av befintliga nätverksfilterkonfigurationer.

Implementeringsfunktioner

Git core är en uppsättning kommandoradsverktyg med alternativ. Alla inställningar lagras i textkonfigurationsfiler. Denna implementering gör Git lätt portabel till vilken plattform som helst och gör det enkelt att integrera Git i andra system (särskilt skapa grafiska git-klienter med valfritt gränssnitt).

Ett Git-förråd är en katalog i filsystemet som innehåller förvarskonfigurationsfiler, loggfiler som lagrar operationer som utförs på förvaret, ett index som beskriver platsen för filerna och ett förråd som innehåller de faktiska filerna. Strukturen för fillagringen återspeglar inte den verkliga strukturen hos filträdet som är lagrat i förvaret; det är fokuserat på att öka hastigheten för att utföra operationer med förvaret. När kärnan bearbetar ett ändringskommando (oavsett om det är på lokala ändringar eller när den tar emot en patch från en annan nod), skapar den nya filer i förvaret som motsvarar de nya tillstånden för de ändrade filerna. Det är viktigt att inga operationer ändrar innehållet i filer som redan finns i valvet.

Som standard lagras förvaret i en underkatalog med namnet " .git " i rotkatalogen för arbetskopian av filträdet som är lagrat i förvaret. Vilket filträd som helst i systemet kan förvandlas till ett git-förråd genom att utfärda kommandot för att skapa ett förråd från rotkatalogen i detta träd (eller genom att ange rotkatalogen i programalternativen). Lagret kan importeras från en annan nod som är tillgänglig över nätverket. Genom att importera ett nytt arkiv skapas automatiskt en arbetskopia som motsvarar det senaste tillståndet för det importerade arkivet (det vill säga, det kopierar inte ändringar i källnodens arbetskopia som inte har utfärdats ett commit -kommando på den noden ).

Arkitektur

Den nedre nivån av git är det så kallade innehållsadresserade filsystemet . Kommandoradsverktyget git innehåller ett antal kommandon för att direkt manipulera detta arkiv på en låg nivå. Dessa kommandon behövs inte för normalt arbete med git som versionskontrollsystem, utan behövs för att implementera komplexa operationer (reparera ett skadat arkiv, och så vidare), och även göra det möjligt att skapa din egen applikation baserat på git-förvaret.

För varje objekt i förvaret beräknas en SHA-1- hash, och det är denna hash som blir namnet på filen som innehåller detta objekt i katalogen .git/objects . För att optimera filsystem som inte använder katalogträd, blir den första byten i hashen namnet på underkatalogen, och resten blir namnet på filen i den, vilket minskar antalet filer i en katalog (den begränsande prestandafaktorn på sådana äldre filsystem).

Alla referenser till förvarsobjekt, inklusive referenser till ett objekt i ett annat objekt, är SHA-1- hashar.

Dessutom finns det en refs- katalog i förvaret , som låter dig ställa in mänskligt läsbara namn för vissa Git-objekt. I Git-kommandon är både mänskliga läsbara referenser från refs och underliggande SHA-1 helt utbytbara.

I det klassiska normalscenariot finns det tre typer av objekt i ett git-förråd - en fil, ett träd och  en commit .  En fil är en version av en användarfil, ett träd är en samling filer från olika underkataloger, en "commit" är ett träd och lite ytterligare information (till exempel förälder-commits, såväl som en kommentar).

Förvaret utför ibland skräphämtning, under vilket föråldrade filer ersätts med deltas mellan dem och de faktiska filerna (det vill säga den aktuella versionen av filen lagras icke-inkrementellt, inkrement används endast för att återgå till tidigare versioner), varefter deltadata läggs till i en stor fil som indexet är byggt till. Detta minskar kraven på lagringskapacitet.

Ett Git-förråd kan vara lokalt eller fjärrstyrt. Det lokala förvaret är en underkatalog av .git , skapad (tom) av git init och (icke-tom, kopierar omedelbart innehållet i det överordnade fjärrlagret och länkar till föräldern) av git clone .

Nästan alla normala versionskontrolloperationer, såsom commits och merges, utförs endast på det lokala arkivet. Ett fjärrlager kan endast synkroniseras med ett lokalt både uppåt ( tryck ) och nedåt ( drag ).

Att ha hela projektförrådet lokalt för varje utvecklare ger Git ett antal fördelar jämfört med SVN . Så till exempel kan alla operationer, förutom push and pull , utföras utan internetanslutning.

En mycket kraftfull funktion hos git är grenar, som är mycket mer fullständigt implementerade än i SVN: i själva verket är en git-gren inget annat än en namngiven länk som pekar på en commit i förvaret (med hjälp av en refs- underkatalog ). En commit utan att skapa en ny gren flyttar bara denna länk till sig själv, och en commit med att skapa en gren lämnar den gamla länken på plats, men skapar en ny på den nya commit och förklarar den aktuell. Att ersätta lokala utvecklingsfiler med en uppsättning filer från en annan gren, och därmed byta till att arbeta med den, är lika trivialt.

Sub-repositories stöds också med synkronisering av aktuella filialer i dem.

Push -kommandot överför all ny data (de som ännu inte finns i fjärrförvaret) från det lokala förvaret till fjärrförvaret. För att utföra detta kommando är det nödvändigt att fjärrförvaret inte har nya commits till sig själv från andra klienter, annars misslyckas pushen och du måste göra en pull och sammanfoga.

Push -kommandot  är motsatsen till push - kommandot . Om samma gren har en oberoende historik i den lokala kopian och fjärrkopian, fortsätter pull omedelbart för att slå samman.

Sammanslagning inom olika filer utförs automatiskt (allt detta beteende är konfigurerbart) och inom en enda fil - genom en vanlig filjämförelse med tre paneler. Efter sammanslagningen måste du förklara konflikter som lösta.

Resultatet av allt detta är ett nytt tillstånd i de lokala filerna för utvecklaren som gjorde sammanslagningen. Han måste omedelbart göra en commit, medan det i detta commit-objekt i arkivet kommer att finnas information om att commit är resultatet av en sammanslagning av två grenar och har två överordnade commits.

Förutom sammanslagning stöder Git också rebasoperationen .  Denna operation får en uppsättning av alla förändringar i gren A, med deras efterföljande "rullning framåt" till gren B. Som ett resultat befordras gren B till delstat AB. Till skillnad från en sammanslagning kommer det inte att finnas några mellanliggande åtaganden för filial A i filial AB:s historia (endast historien om filial B och en registrering av själva rebasen, detta förenklar integrationen av stora och mycket stora projekt).

Git har också ett tillfälligt lokalt filindex. Detta är en mellanlagring mellan de faktiska filerna och nästa commit (en commit görs endast från detta index). Med hjälp av detta index läggs nya filer till ( git add lägger till dem i indexet, de kommer att hamna i nästa commit), liksom inte alla ändrade filer committeras (endast de filer som skapades av git add är committerade ). Efter git add , kan du redigera filen ytterligare, du kommer att få tre kopior av samma fil - den sista, i indexet (den som var vid tidpunkten för git add ), och i den senaste commit.

Standardgrennamn: master . Namnet på standardfjärrförvaret skapat av git clone under en typisk "dra ett befintligt projekt från servern till din maskin"-operation: origin .

Sålunda har det lokala förvaret alltid en huvudgren , som är den senaste lokala commit, och en ursprungs-/ huvudgren , som är det senaste tillståndet för fjärrförvaret vid den tidpunkt då den senaste dragningen eller pushen slutfördes .

Fetch -kommandot (partial pull ) - hämtar alla ändringar i ursprung/master från fjärrservern och skriver om dem till det lokala arkivet, vilket främjar origin/master -taggen .

Om efter att master och ursprung/master har divergerat, måste du slå samman genom att ställa in master till resultatet av sammanfogningen ( pullkommandot är hämta+merge ). Vidare är det möjligt att pusha genom att skicka resultatet av sammanslagningen till servern och ställa in ursprung/master till den .

Implementeringsdetaljer på Windows

Windows-versionen (den officiella Windows-versionen kallas mSysGit) använder paketet mSys  , en port för en POSIX -kompatibel Windows-kommandorad från MinGW- projektet . Alla bibliotek och verktyg som behövs för Git, såväl som själva Git, har flyttats under mSys. När man arbetar med fjärrlager över SSL används certifikatarkivet från mSys, inte från Windows.

Det finns många GUI för Git för Windows, som TortoiseGit . Alla implementeras genom anrop till mSysGit och kräver att det installeras på maskinen. SourceTree, Atlassians lösning , är inget undantag, men den innehåller mSysGit, som har sina för- och nackdelar (eftersom installation i en djup underkatalog gör det svårt att lägga till nödvändiga SSL-certifikat till mSys).

Eftersom Windows använder en annan radens slutkaraktär än de flesta Unix-liknande system finns det alternativ (både klient- och arkivnivå) för team över operativsystem för att tillhandahålla en enhetlig radens slutrepresentation.

Nätverks- och serverlösningar

Git använder bara nätverket för att dela operationer med fjärrlager.

Följande protokoll kan användas:

I det senare fallet måste du arbeta på serversidan av en webbapplikation som fungerar som ett lager mellan Git-kommandona på servern och HTTP-servern (bland dem är WebGitNet, utvecklat på ASP.NET MVC 4). Förutom att stödja push- och pull-kommandon på serversidan, kan sådana webbapplikationer även ge skrivskyddad åtkomst till förvaret via en webbläsare.

Grafiska gränssnitt

Många grafiska gränssnitt har utvecklats för systemet, bland dem - GitKraken (en plattformsoberoende shareware Git-klient), SmartGit (ett plattformsgränssnitt i Java), gitk (ett enkelt och snabbt program skrivet i Tcl / Tk distribuerat med Git sig), Giggle (en variant i Gtk+ ), TortoiseGit (ett gränssnitt implementerat som ett Windows Explorer -tillägg ), SourceTree (en gratis Git-klient för Windows och Mac), en Github- klient och ett antal andra.

Dessutom har många webbgränssnitt utvecklats, inklusive GitWebAdmin, GitLab , Gitblit, Gerrit , Gitweb, Kallithea, Gitea .

Git hosting

Ett antal tjänster tillhandahåller värd för git-repositories, bland de mest kända är GitHub , Codebase , SourceForge , SourceHut , Gitea , Bitbucket , GitLab .

Interaktion med andra versionskontrollsystem

Standarddistributionen av Git stöder interaktion med CVS (import och export, CVS-serveremulering) och Subversion (partiellt stöd för import och export). Standardverktyget för import och export inom ekosystemet är arkiv med en serie versionsfiler i .tar.gz- och .tar.bz2-format.

Anteckningar

  1. https://github.com/git/git/graphs/contributors
  2. Re: Trivia: När var git självvärd?
  3. [ANNONSERA Git v2.38.1 och andra] - 2022.
  4. Git Open Source Project på Open Hub: Languages-sidan - 2006.
  5. 1 2 3 4 5 6 Git-paketformat
  6. Kopiera  _
  7. git . Hämtad 19 juni 2009. Arkiverad från originalet 14 april 2010.
  8. BitKeeper och Linux: Slutet på vägen? (inte tillgänglig länk) . Hämtad 7 november 2017. Arkiverad från originalet 8 juni 2017. 
  9. Torvalds tal . Hämtad 28 september 2017. Arkiverad från originalet 28 maj 2007.
  10. GitFaq: Varför "Git"-namnet . Hämtad 7 november 2017. Arkiverad från originalet 23 juli 2012.
  11. Efter kontroverser börjar Torvalds arbetet med 'git' . PC-världen. Hämtad 7 november 2017. Arkiverad från originalet 1 februari 2011. Originaltext  (engelska)[ visaDölj] På frågan om varför han kallade den nya mjukvaran "git", sa han brittisk slang som betyder "en rutten person". "Jag är en egoistisk jävel, så jag döper alla mina projekt efter mig själv. Först Linux, nu git."
  12. Git - Transfer Protocols . Datum för åtkomst: 28 oktober 2013. Arkiverad från originalet 29 oktober 2013.
  13. Git på servern - Git daemon . Hämtad 9 maj 2022. Arkiverad från originalet 20 april 2017.

Länkar

Handledningar Officiella webbplatser Intervju

Litteratur

  • Chacon S., Straub B. Git för den professionella programmeraren. - Peter , 2017. - 496 sid. — ISBN 978-5-496-01763-3 .