Versionshantering med Git Henrik Henriksson 17 april 2018 1
Versionshantering? rapport_v0.4.docx rapport_v0.5.pdf rapport-v1.0.cpp rapport_v1.0.docx raport_v0.9-final.docx komplettering-v2.0.docx färdig.7.pdf rapport_v1.1.docx rapport_v1.0-inlämnad.rtf henhe459.docx 2
Vad vill vi ha från vår versionshantering? Ett bra versionshanteringssystem bör bland annat Låta oss ändra saker utan att förstöra tidigare arbete Se vad som förändrats mellan två versioner Hjälpa oss arbeta flera personer i samma projekt Ha ett bra workflow Ha en översikt över projektets historia Veta att vårt arbete är säkert Veta att tidigare versioner inte har ändrats 3
Vad vill vi ha från vår versionshantering? Att ta kopior på filer hjälper oss att Låta oss ändra saker utan att förstöra tidigare arbete Se vad som förändrats mellan två versioner Hjälpa oss arbeta flera personer i samma projekt Ha ett bra workflow Ha en översikt över projektets historia Veta att vårt arbete är säkert Veta att tidigare versioner inte har ändrats 4
Vi vill ha mer... För att versionshantera kod finns väldigt många system, alla med sina fördelar och nackdelar. Även om de äldre systemen ( 2000) mest har nackdelar idag. RCS (1982) CVS (1986) BitKeeper (2000) Darcs (2002) SVN (2004) Mercurial (2005) Git (2005)... 5
Git Git är troligen det mest populära versionshanteringsverktyget idag Git skrevs ursprungligen av Linus Torvalds specifikt för versionshantering av källkoden till Linux-kärnan 1 Linus är en kernelutvecklare, inte en gränssnittsdesigner Gits användargränssnitt har utvecklats organiskt av andra kring de få funktioner Linus ursprungligen lade till Git = GitHub = GitLab 1 En intressant historia som tyvärr är för lång för den här marginalen 6
Git För att använda git behöver vi ha koll på några saker En git repository är en mapp med några specialfiler som git använder för att hålla koll på vår historik Vi kan versionshantera allt som ligger i mappen Gits specialfiler ligger alla i den dolda undermappen.git Filerna som ligger utanför.git är vår arbetskopia Vi kan göra vad vi vill med vår arbetskopia utan att påverka historiken! 7
Lite metadata Git tycker om att veta vem man är. $ git config -global user.name "Henrik Henriksson" $ git config -global user.email "hx@hx.ax" $ git config -global core.editor nano 8
git init För att skapa en git repository kör vi kommandot git init git init skapar en.git mapp, men gör ingenting annat Gamla filer i mappen kommer ligga kvar ostört 9
git status git status är generellt sett det kommando man använder mest Visar upp en allmän status för hela repon Tips: Det är bra att köra git status före man kör något annat git-kommando. Varje gång. 10
Diffar, Deltan och Stora Dält Ett delta, ibland kallat för diff är en beskrivning över vad som har ändrats i en eller flera filer Vi kan läsa diffar för att veta vad som ändrats Vi kan skapa en nyare version av en fil genom att patcha den med ett delta Vi kan till och med skapa filer från en serie delta + A + A B + B C C 11
Diffar Vi kan bygga upp vårt projekt genom att gå genom alla förändringar som skett! 12
Stageing Saker kan ha lite olika status Untracked Filer som inte borde finnas Clean Filer som är vad de borde vara Modified Saker som ändrats från vad de borde varit Staged Ändringar vi vill spara permanent 13
Commit En commit 2 är en diff som man valt att spara undan tillsammans med lite extra metadata. Praktiskt sett så är det en version. I en commit finns bland annat 3 En diff Ett unikt ID Förälderns unika ID En beskrivning över vad commiten innehåller Vem som skapat commiten Tidstämpel Det unika ID som används är en SHA1-hash skapad från resten av informationen 2 Begångande på svenska. Använd engelska. Snälla. 3 Detta gäller git, men de flesta system har liknande data i en commit 14
Commit Eftersom varje commit har en förälder kan vi ta fram en lista med de commits som lett fram till godtycklig commit, från tidernas begynnelse En commit går att hitta via commitens hash Vi kan alltså återskapa hur hela projektet såg ut, in i minsta detalj, utgående från en hash, eller till och med bara de första 5 10 tecknen i hashen 15
git commit git commit används för att skapa en ny commit baserat på vad som är staged git commit Öppnar upp en textredigerare man får skriva sitt commitmeddelande i och skapar sedan en commit git commit -m meddelande Skapar en commit direkt 16
git add git add används för att stagea filer, markera att man vill committa dem. Kallas ofta för att adda eftersom att stagea inte är ett vettigt svenskt ord. git add exempel.txt Markera nuvarande förändringar i filen exempel.txt som staged git add -p Git lotsar dig genom alla förändringar, hunks, i projektet och frågar vilka du vill adda 4 4 tryck på? för hjälp 17
git reset För att ta bort saker ur staged så används git reset. Ändringar tas inte bort, bara adden. git reset Rensar staged helt git reset exempel.txt Tar bort exempel.txt ur staged git reset -p Git frågar vilka saker du vill plocka bort ur staged. 18
git diff git diff Visar diffen mellan historiken och vad man ännu inte har addat, oftast helt enkelt vad man har ändrat git diff -staged Visar diffen mellan historiken och staged 19
git log För att få se en historik över tidigare commits använder man git log. Det finns några olika flaggor som är bekväma att använda git log -graph Visualisera grafen som vår historik utgör git log -p Visa diffarna git log -oneline Visa bara committmeddelande 20
git checkout git checkout hello.cpp kan användas för att nollställa filen hello.cpp 21
Remotes För att man ska kunna arbeta tillsammans behöver man kunna skyffla runt historik mellan olika datorer GitHub, GitLab, Bitbucket, etc Skapa en SSH-nyckel för autentisering $ ssh-keygen (och spamma Enter ) $ cat ~/.ssh/id_rsa.pub (kopiera) Klista in på rätt ställe i GitHub/Lab/Bucket 22
git push git push trycker upp nya ändringar i historiken till remote 5 5 Man trycker upp från den branch man står i till motsvarande på remote. För att trycka upp allt: $ git push -all För trycka upp en ny branch som inte finns på remote: $ git push -u origin namn 23
Branching Vi behöver inte begränsa oss till endast en förälder, vi kan ha flera! Vi kan göra nya grenar 6 genom att ha två olika commits med samma förälder Vi kan slå ihop grenar genom att låta en commit ha flera föräldrar, en merge Vår historik är en riktad acyklisk graf 6 eng: branch 24
git branch Kommandot git branch visar vilka grenar som finns och vilken man står på just nu. För mindre projekt använder man ofta bara en, master 25
git pull För att dra ner ändringar från servern används git pull. 7 7 Pull jobbar på den gren man står i. 26
Konflikter Men om ändringarna krockar då? 8 Känns det jobbigt? Googla git mergetool 27
Konflikter Men om ändringarna krockar då? Git skriker argsint på dig Andas, det är lätt att lösa Kör $ git status och kolla vilka filer det krockar i Öppna filerna en i taget och sök efter <<<<. Gör så att det ser rätt ut och spara 8 Kör $ git add och $ git commit som vanligt. Ibland addar git automatiskt åt en. 8 Känns det jobbigt? Googla git mergetool 27
git clone För att hämta hem en existerande git-repo använder man git clone <url>. Det går att copy pasta rakt av från GitHub/Lab/Bucket. 28
Commits Det är viktigt att göra bra commits En diskret ändring per commit Beskrivande meddelande, max 80 tecken Inga onödigheter i diffen 29
Fler funktioner!
git checkout B 30
git checkout -b C 31
git merge B 32
git rebase B 33
git revert <hash> 34
Nu backar vi lite
Vad vill vi ha från vår versionshantering? Git hjälper till att Låta oss ändra saker utan att förstöra tidigare arbete Se vad som förändrats mellan två versioner Hjälpa oss arbeta flera personer i samma projekt Ha ett bra workflow Veta att vårt arbete är säkert Veta att tidigare versioner inte har ändrats Ha en översikt över projektets historia 35
Några tips $ git log filnamn.txt $ git blame filnamn.txt Den senaste committen på branchen man står på kallas för HEAD Läs på om branching före man börjar använda det aktivt 36
Avslutande ord Git är ett otroligt kraftfullt verktyg. På gott och ont. Börja enkelt, commit, push och pull räcker till det mesta Kör hellre en commit för mycket än en för lite Försök att inte jobba på samma ställe som någon annan för att slippa konflikter Ta en kopia på ett projekt för att testa vad olika kommandon gör $ git <kommando> -help https://www.youtube.com/watch?v=4xpnkhjaok8 37