Git har på kort tid blivit det mest populära verktyget för versionshantering. Men vad är då Git och hur fungerar det? Det ska vi reda ut här!

Installera och ställa in Git

Använder du någon Debianbaserad distrubition installerar du enklast Git med kommandot apt-get install git. Använder du CentOS eller något annan Red Hat-baserad dist använder du kommandot yum install git. Glöm inte bort att du måste vara root för att kunna installera programmet.

Använder du Windows måste du själva ladda hem programmet från https://git-scm.com/download/win och installera det manuellt.

Några inställningar

När vi väl installerat Git är det dags att ställa in några viktiga inställningar. Dessa är främst ditt namn och din e-postadress. Dessa används för att identifiera dig när du bidrar till koden i en “Git-repo”, alltså ett projekt som använder Git.

Så här stället du in ditt namn och e-postadress

$> git config --global user.name "Kalle Anka"
$> git config --global user.email "kalle@cyberinfo.se"

git config används för att göra diverse inställningar, både globalt med --global och icke globalt. Globala inställningar innebär att inställningar sparas för den aktuella användaren, oavsett projekt. Man kan även ställa in sitt namn och e-postadress för ett specifikt projekt ifall det skiljer sig från det globala.

Om du vill ställa in ditt namn och din e-postadress för en specifik “Git-repo”, alltså projekt, ändrar du katalog så att du står i den aktuella katalogen och använder samma kommando som ovan, fast du utelämnar --global.

Skapa din första Git-repo

Att skapa din första Git-repo kan verka komplicerat i början, så vi tar det steg för steg. Antingen skapar du en tom katalog om du vill påbörja ett helt nytt projekt, annars går det lika bra med en katalog med befintlig kod i. Observera dock att alla filer i katalogen kommer att finnas med i Git-repon ifall du använder argumentet -A som i nedanstående exempel.

Här skapar vi en tom katalog med en testfil i.

ANNONS FÖR VÅRA EGNA BÖCKER Demonerna på internet

$> mkdir test
$> cd test
$> echo "Testfil nummer 1" > test.txt
$> git init
Initialized empty Git repository in /home/jake/test/.git/

All information om vår nya Gir repo finns nu i katalogen .git som finns inuti vår Git-repo. Här kommer alla våra commits med mera att sparas.

Lägga till filer och commita dem

Nu har det blivit dags att lägga till några filer i vår Git-repo. Just nu finns faktiska inga filer i Git. Vi kan börja med att titta hur det ser ut just nu med kommandot git status.

$> git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test.txt

nothing added to commit but untracked files present (use "git add" to track)

Här ser vi att vår nya fil test.txt som vi skapade är “Untracked”, den tas alltså inte om hand av Git ännu. På sista raden ser vi också en sammanställning av hur Git-repon ser ut just nu, det vill säga “nothing added to commit, but untracked files present”.

För att lägga till filer från katalog till Git använder vi kommandot git add. Vi kan antingen lägga till enskilda filer, till exempel git add test.txt för att lägga till endast filen test.txt. Men mest troligen vill man lägga till samtliga filera i en katalog, istället för en fil i taget. Detta gör vi med git add -A, där -A står för “All files”.

$> git add -A

Nu är filen tillagd, men ännu inte “commitad”. Om vi kollar statusen igen med git status så kommer vi att se just detta.

$> git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test.txt

Nu är filen test.txt i ett läge som kallas för “staged”. Vi får till och med hjälp från Git med hur vi kan “unstage” en fil.

Men nu vill vi gå vidare med att faktiskt commita filerna. Detta gör vi med git commit.

$> git commit -m "Ett kort beskrivande meddelande vad commiten handlar om"
[master] (root-commit) dc01a72] Ett kort beskrivande meddelande vad commiten
handlar om 
 1 file changed, 1 insertion(+) 
 create mode 100644 test.txt

Om vi nu åter kollar läget med git status kommer vi få bekräftelse att allting är commitat och klart.

$> git status
On branch master
nothing to commit, working tree clean

Allt är nu således frid och fröjd. Git tar nu hand om versionerna av filen åt oss. Vi kan nu se loggen för denna Git-repo med git log.

$> git log
commit dc01a7287d9d512743fead2a6ecacb5503717e32
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed May 31 04:06:27 2017 +0200

    Ett kort beskrivande meddelande vad commiten handlar om

Här finns än så länge bara en enda commit, den vi precis skapade. Nu lägger vi till lite mer text i filen och skapar två nya commits.

$> echo "Radnummer två" >> test.txt 
$> git add -A
$> git commit -m "Lagt till en andra rad"
[master 09db2d0] Lagt till en andra rad
 1 file changed, 1 insertion(+)
 
$> echo "Tredje raden i filen" >> test.txt 
$> git add -A
$> git commit -m "Lagt till ytterligare en rad"
[master 396878a] Lagt till ytterligare en rad
 1 file changed, 1 insertion(+)

Om vi nu tittar i loggen för vårt projekt ser vi att vi har tre stycken commits.

$> git log
commit 396878a12c9cd592a8ed1af1f424aeb1fe432fe4
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed Jun 7 05:18:56 2017 +0200

    Lagt till ytterligare en rad

commit 09db2d02a41ce4f28d1a1df2e1b958cd31cbd464
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed Jun 7 05:18:12 2017 +0200

    Lagt till en andra rad

commit dc01a7287d9d512743fead2a6ecacb5503717e32
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed May 31 04:06:27 2017 +0200

    Ett kort beskrivande meddelande vad commiten handlar om

Checka ut commits och göra ändringar

Låt oss nu anta att jag vill återgå till när jag endast hade två rader i filen för att lägga till en annan tredje rad. Om vi tittar i loggen ser vi att commit 09db2d02a41ce4f28d1a1df2e1b958cd31cbd464 är den commit som hade två rader i filen. Nu behöver vi göra en checkout av den commiten. För att göra en ändring i Git checkar man alltid ut den commit man vill ändra i i en ny gren. Här ska vi alltså göra två steg i ett, skapa en ny gren, och checka ut den commit som börjar med 09db2d (man behöver bara ange de första tecknen).

$> git checkout -b buggfix 09db2d
Switched to a new branch 'buggfix'

Om vi kör en git status så kommer vi att se att vi är i grenen buggfix. Om vi titta på innehållet i test.txt ser vi att vi återgått till endast två rader.

$> cat test.txt
Testfil nummer 1
Radnummer två

Vi lägger nu till en ny tredje rad och skapar en ny commit.

$> echo "Den nya fina tredje raden" >> test.txt

Och om vi tar en titt på vilka skillnader det nu finns så kan vi skriva git diff, vilket ger följande resultat:

diff --git a/test.txt b/test.txt
index e26e1f6..c43b71b 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,3 @@
 Testfil nummer 1
 Radnummer två
+Den nya fina tredje raden

Nu är det dags att lägga till och commita den nya ändringen.

$> git add -A
$> git commit -m "Lagt till en ny tredje rad"
[buggfix 6d942a4] Lagt till en ny tredje rad
 1 file changed, 1 insertion(+)

De ändringar vi nu gjort har vi gjort en egen gren som heter buggfix. Vi ska nu återgå till huvudgrenen, master. Detta gör vi med checkout.

$> git checkout master
Switched to branch 'master'

Om vi nu tittar i filen test.txt ser vi att den gamla raden fortfarnade finns här. Detta är ju en annan gren.

$> cat test.txt
Testfil nummer 1
Radnummer två
Tredje raden i filen

Nu ska vi göra en merge för att slå samma vår nya buggfix-gren med huvudgrenen. Detta gör vi att för att vi vill behålla ändringen vi gjorde i huvudgrenen av projektet.

$> git merge buggfix
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result

Nu misslyckades Git att göra en automatisk merge eftersom vi ändrat på samma rad i samma fil. Nu behöver vi öppna vår editor, exempelvis vi och lösa konflikten. Innehållet i filen ser nu ut som följande:

Testfil nummer 1
Radnummer två
<<<<<<< HEAD
Tredje raden i filen
=======
Den nya fina tredje raden
>>>>>>> buggfix

Nu rensar vi upp HEAD och tar bort markeringarna så att filen ser ut så som vill ha den.

Testfil nummer 1
Radnummer två
Den nya fina tredje raden

Nu kan vi göra en ny commit och därefter radera den tillfälliga buggfix-grenen eftersom vi nu är klara.

$> git add -A
$> git commit -m "Klar med buggfixen"
[master ff2533f] Klar med buggfixen
$> git branch -d buggfix
Deleted branch buggfix (was 6d942a4).

Om vi nu tittar i loggen kan vi se alla commits, inklusive den commit vars innehåll vi ändrade (“Lagt till ytterliggare en rad”).

$> git log
commit ff2533f487eb03c366eb51c62276b9423c8d94a3
Merge: 396878a 6d942a4
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed Jun 7 05:45:01 2017 +0200

    Klar med buggfixen

commit 6d942a429b6a1cf30a6561f30a0774e9da19d61c
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed Jun 7 05:36:05 2017 +0200

    Lagt till en ny tredje rad

commit 396878a12c9cd592a8ed1af1f424aeb1fe432fe4
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed Jun 7 05:18:56 2017 +0200

    Lagt till ytterligare en rad

commit 09db2d02a41ce4f28d1a1df2e1b958cd31cbd464
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed Jun 7 05:18:12 2017 +0200

    Lagt till en andra rad

commit dc01a7287d9d512743fead2a6ecacb5503717e32
Author: Jack-Benny Persson <jack-benny@cyberinfo.se>
Date:   Wed May 31 04:06:27 2017 +0200

    Ett kort beskrivande meddelande vad commiten handlar om

Detta betyder alltså att historiken fortfarande finns kvar i Git, så vi kan fortfarande gå tillbaks och se hur filen såg ut just då.

Vi tittar först hur filen ser ut nu med cat test.txt och checkar därefter ut commit 396878a för att jämföra. Därefter återgår vi till där vi är i projektet just nu.

$> cat test.txt
Testfil nummer 1
Radnummer två
Den nya fina tredje raden

$> git checkout 396878a
Note: checking out '396878a'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 396878a... Lagt till ytterligare en rad

$> cat test.txt
Testfil nummer 1
Radnummer två
Tredje raden i filen

$> git checkout master
Previous HEAD position was 396878a... Lagt till ytterligare en rad
Switched to branch 'master'

$> cat test.txt
Testfil nummer 1
Radnummer två
Den nya fina tredje raden

Avslutning

Du har nu lärt dig allt det grundläggande du behöver kunna för att arbeta med Git. Det finns en hel del kvar att lära sig om Git, men just detta vi precis har gått igenom ligger till grund för allt i Git. Att kunna skapa commits, checka ut commits och grenar, göra ändringar, mergea, eller slå samman grenar. Detta är grunden för allt i Git.


Nyhetsbrev
Nyhetsuppdateringar från tidningen direkt till din inkorg, helt kostnadsfritt. Avsluta när du vill.

Kommentarer

Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.

Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.