Samarbete & Branches

Tidigare har du fått testa på att använda Git och GitHub för att hålla reda på historiken på ett projekt du arbetar på helt själv. Vi skall nu kika på hur Git och GitHub kan användas för att underlätta för flera personer att samarbeta kring ett och samma projekt.

Linjär och förgrenad commit historik

I tidigare exempel har du skapat en linjär historik över förändringar genom att göra en serie commits där tiden hela tiden går framåt. Med Git går det även att låta historiken förgrena sig i så kallade branches. På detta sätt är det möjligt att skapa alternativa tidslinjer (precis som i science fiction).

Det visar sig att förgreningar (branches) kan vara mycket användbara för att underlätta samarbete med andra kring ett projekt.

Den dolda katalogen .git/branches

Kommer du ihåg den dolda katalogen .git som Git använder sig av? Git använder sig av katalogen .git/branches för att hålla reda på grenar (branches) i ett repo.

Master branch

Egentligen görs i princip ingen skillnad mellan den första grenen (som brukar kallas master) och andra branches – det går t.o.m. att ta bort master om man skulle vilja. kodprojekt senare.

Ta reda på vilken branch du befinner dig

Vi kan visa vilken branch vi för tillfället är på med hjälp av kommandot git branch:

$> git branch

Om du inte tagit bort eller ändrat namn på den ursprungliga branchen kommer resultatet att se ut så här:

* master

De kan hända att ditt system är uppsatt på ett sätt som gör att du istället ser något liknande detta:

* master
(END)

I detta fall måste du trycka på q för att komma tillbaka till prompten i terminalen efter det att Git visas namnet på den branch du befinner dig på.

I båda exemplen ovan visar Git att du att du befinner dig på branchen med namn master, dvs den branch som repot alltid startar med.

Du måste har gjort minst en commit

Om du inte gjort något commit i ditt repo ännu kommer git branch inte att ge något resultat. Du måste göra minst en commit i ditt repo för att den första branchen master automtiskt skall skapas.

Skapa en ny branch

För att skapa en ny branch används kommandot git checkout -b. För att till exempel skapa en ny branch med namnet experiments gör du så här.

$> git checkout -b experiments

Git svarar då med följande.

Switched to a new branch 'experiments'

För säkerhets skull kollar vi vilken branch vi nu befinner oss i.

$> git branch

Denna gång svarar Git så här.

* experiments
  master

Git listar alltså alla branches och markerar den branch du för tillfälle befinner dig på med *.

Hoppa mellan branches

För att hoppa mellan befintliga branches används kommandot git checkout, denna gång utan flaggan -b som endast används när vi skapar en ny branch. För att hoppa tillbaka till branchen master gör du så här.

$> git checkout master

Git visar att du hoppat till branchen master med följande meddelande.

Switched to branch 'master'

Remotes

Det som gör Git användbart vid samarbete med andra är framför allt möjligheten att synkronisera repositories med sina branches via servrar, s.k. remotes. Ett vanligt fall som vi redan kikat på är att sätta upp ett remote repo på GitHub.

En remote sparar den senaste gemensamma versionen av projektets historia så att alla kan hämta hem andras ändringar – men också skicka upp sina egna. Ett inbyggt låssystem ser till att det är omöjligt att skicka upp sina ändringar utan att först ha hämtat de senaste gemensamma ändringarna från remoten. På så sätt kan man säkerställa att alla i projektet är överens om hur den gemensamma koden ser ut, även om man arbetar oberoende av varandra.

Merge

Det går att slå ihop branches till en gemensam tidslinje igen, vilket kallas för en merge (lämpligt nog). Det betyder att Git gör sitt bästa för att passa ihop ändringarna som gjorts sedan den gemensamma brytpunkten för två branches. I praktiken görs också en merge när kod hämtas från en remote med git pull.

Om någon gjort en ändring i en branch som du inte har sett och du gör merge med kommer Git att göra sitt bästa för att pussla de två grenarna och varna om det inte går.

Merge conflict

Git gör sitt bästa för att automatiskt pussla ihop olika förändringar vid en merge. Ibland kan dock inte Git göra detta automatiskt och då uppstår det som kallas före en merge conflict.

Vid en merge conflict kommer Git att ge en varning. Det är nu upp till den mänskliga användaren att på egen hand avgöra hur konflikten skall lösas. När konflikten löst gör du sedan en ny commit precis som vanligt.