Git er etversjonskontrollsystem, en typeprogramvare. Det kjennetegnes ved å væredistribuert og ikkemappehierarki-basert (se Egenskaper). Et viktig designkriterium for Git var hastighet ved sammenfletting (merging). Git ble påbegynt avLinus Torvalds, men på et tidlig tidspunkt overtatt avJunio Hamano, som nå leder videre utvikling og vedlikehold. Blant andre distribuerte versjonskontrollsystemer kan nevnesMercurial, som ble startet omtrent samtidig med Git, ogBitkeeper, en kommersiell forløper som var den viktigste inspirasjonskilden for Git.
- Distribuert: Git har egne kommandoer,pull ogpush, for synkronisering med andre repositorier. Dette muliggjør alle-til-alle-synkronisering (ikke bare alle-til-én, som iCVS ogSVN). Dessuten, uten implisitt synkronisering trenger man for eksempel ikke å være koblet til nettverk hele tiden for å kunne jobbe. Hovedpoenget med distribusjon i versjonskontrollsystemet er å kunne støtte desentralisert arbeidsflyt, for eksempel tillitsbasert pyramidestruktur, som er typisk for store prosjekter basert pååpen kildekode. Til gjengjeld, for sentralisert arbeidsflyt, blir det flere kommandoer for brukeren å skrive; det som hetercommit i CVS og SVN, vil i Git tilsvare sekvensencommit,pull ogpush.
- Ikke mappehierarki-basert: Undermapper av repositoriet er ikke repositorier (i motsetning til CVS og SVN). Dette er i seg selv en ulempe, men gjør Git i stand til å forstå navneendringer og flytting av filer. Dette har flere fordeler: ikke bare unngås dobbeltlagring hver gang en fil flyttes eller endrer navn, men hvis man også er påpasselig med å bruke Gitsmv-kommando, vil historikken dens følge med, og handlingen vil ikke skape konflikt med eventuelle endringer av innholdet.
- Sjekksum av innhold: Alt innhold i et Git-repositorium er indeksert ettersha1-sum. I tilfellebitfeil i lagring eller overføring, kan man være rimelig sikker på at det vil oppdages. En sliksjekksum har den egenskap at den kan regnes ut dersom man har innholdet og den vil også endres dersom innholdet endres. Git bruker dette både som nøkler til innhold og for å oppdage endringer mellom arbeidskatalog og Git-repositorium.
- Bedre til merge enn til branch: (Dette også i motsetning til CVS og SVN).
Selv om git-funksjonalitet også er tilgjengelig gjennom grafiske programmer (f.eks. gitk, SourceTree), tilleggsfunksjonalitet i populære editorer (Visual Studio, IntelliJ), serversideprogrammer (cgit, GitLab, Gerrit, BitBucket) og enkeltstående nettsider (GitHub), er Git i seg selv et kommandospråk.
Etgit-repositorium (ofte forkortetrepo) kan lages utfra en hvilken som helst mappe med kommandoengit init
. Da etableres det en undermappe med navn.git
. I denne lagres historikken til filer som befinner seg i repositoriet og dets undermapper. Historikken består av endringstransaksjoner (commit) som brukere har lagret, og kan forgreines, rebaseres på hverandre og spleises (branch/rebase/merge). Hovedgreina er vanlig å kallemaster ellermain. Man kan bytte aktiv grein medgit checkout
, og den til enhver tid gjeldende greina av historien kalles med et synonymHEAD
.
Filer må eksplisitt legges til (git add
) for å være under versjonskontroll. Endringer vil da oppdages, og vises avgit diff
. For å lage en endringstransaksjon av endringene, bruker man så kommandoengit commit
. Filer som ikke er under versjonskontroll vil vises avgit status
; disse kan ignoreres ved å legge dem til i fila.gitignore
.
I stedet for nummererte endringstransaksjoner er hver av disse navngitt ved sin egensha1-sjekksum. Endringstransaksjonene kan også gis alternative navn medgit tag
, typisk for versjonering. Historikken kan vises på forskjellige vis: Endringer kan oppramses i rekkefølge medgit log
eller linjevis per fil medgit blame
.
For å kunne jobbe frakoblet, har Git et konsept om fjerne repositorier som bare synkroniseres eksplisitt.Når et repositorium klones (git clone
) fra et annet, vil det opprinnelige repositoriet automatisk få navnetorigin
i det klonede repositoriet, og dette navnet brukes for å angi hvilket fjernt repositorium man synkroniserer med. Andre kan legges til og fjernes medgit remote
.Synkronisering er heller ikke tosidig: Henting av endringer skjer medgit fetch
(ellergit pull
, som er en kombinasjon avfetch ogmerge), mens å pådytte endringer på et fjernt repositorium (git push
) krever skrivetilgang, noe man typisk ikke har med mindre det er ets eget. Derfor er det også vanlig å sende hverandre såkaltepull requests ellerpatcher viae-post.
Følgende avsnitt gir eksempler på hvordan man kan bruke git viakommandolinje / terminal. Den tar utgangspunkt i at man med kommandolinje har navigert frem til en mappe som inneholder en fil ved navn "kildekode.cpp".
git init
Lager et nytt git respository i mappen du kjører kommandoen. Det er her alle kildefiler og versjoner av disse lagres.
git add kildekode.cpp
Legger til filen kildekode.cpp midlertidig til versjonen av prosjektet du jobber på. Hvis dette ikke er oppgitt vil du dytte opp til master versjonen (master branch).
git commit -m "lagt til første kildekodefil"
Gjør en commit på endringer og opprettelse av nye filer til versjonen av prosjektet du jobber på. Det vil si at endringene blir lagt til permanent og at disse dukker opp i loggen med meldingen "lagt til første kildekodefil".
git log --graph
Viser loggen til git prosjektet som er i mappen du befinner deg i. Flagget "--graph" lager en grafisk illustrasjon av hvordan de forskjellige versjonene av prosjektet er flettet sammen. Loggen inneholder også hvem som utførte commiten, og når dette ble gjort.