Hoppa till innehåll

Merge-konflikter

  • Varför en konflikt uppstår vid en merge.
  • Att läsa markeringarna <<<<<<<, ======= och >>>>>>> i en fil.
  • Att lösa konflikten och avsluta sammanslagningen.
  • Att avbryta en sammanslagning med git merge --abort.

Förr eller senare ändrar två grenarBranchEn egen utvecklingslinje i ett repository, där man kan göra ändringar utan att påverka huvudversionen.Läs mer om grenar samma rad på olika sätt. Då kan GitGitEtt program som sparar versioner av filerna i ett projekt, så att man kan se vad som ändrats, gå tillbaka till tidigare versioner och arbeta flera samtidigt.Läs mer om Git inte veta vilken version som är rätt, och ber dig bestämma. Det är ett helt vanligt läge, inte ett fel. Den som vet hur man löser en konflikt behöver aldrig vara rädd för att arbeta parallellt.

När du gör en mergeMergeAtt föra ihop ändringarna från två branches till en. Git gör det automatiskt när det går och ber om hjälp när samma rader ändrats på olika sätt.Läs mer om merge jämför Git varje fil på de två grenarna med hur den såg ut där grenarna delade sig:

  • Har bara den ena grenen ändrat en rad, tar Git den ändringen.
  • Har båda grenarna ändrat olika delar av filen, tar Git båda ändringarna.
  • Har båda grenarna ändrat samma rad på olika sätt, blir det en konflikt. Det blir det också när ändringarna ligger på rader direkt intill varandra, eftersom Git då inte kan veta i vilken ordning de ska stå.

Vid en konflikt stannar Git mitt i sammanslagningen. Git skriver in båda versionerna i filen, med markeringar runt, och väntar på dig. Inget har försvunnit, och du kan alltid ångra dig med git merge --abort.

Markeringarna ser ut så här:

<<<<<<< HEAD
din version, från grenen du står på
=======
den andra grenens version
>>>>>>> namnet på den andra grenen

På grenen vasteras har dag 2 bytts till Västerås. Samtidigt har dag 2 bytts till Enköping på main. Båda ändringarna har sparats som commits. Stå på main och gör en merge:

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

git status visar vilken fil som har en konflikt, och vad du kan göra:

Terminal
$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: resplan.txt
no changes added to commit (use "git add" and/or "git commit -a")

both modified betyder att båda grenarna har ändrat filen. Öppna den:

resplan.txt
Resplan sommaren 2027
Dag 1: Stockholm
<<<<<<< HEAD
Dag 2: Enköping
=======
Dag 2: Västerås
>>>>>>> vasteras
Dag 3: Gävle
Dag 4: Sundsvall

Resten av filen är redan sammanslagen. Bara raden om dag 2 behöver ditt beslut. Mellan <<<<<<< HEAD och ======= står versionen från main, där du står. Mellan ======= och >>>>>>> vasteras står versionen från vasteras.

Bestäm vad som ska gälla. Det kan vara den ena versionen, den andra, båda eller något helt nytt. Här blir det Västerås. Ta bort raden med Enköping och alla tre markeringsraderna, och spara filen:

resplan.txt
Resplan sommaren 2027
Dag 1: Stockholm
Dag 2: Västerås
Dag 3: Gävle
Dag 4: Sundsvall

Tala om för Git att konflikten är löst med git add, och avsluta sammanslagningen med en commit:

Terminal
$ git add resplan.txt
$ git status
On branch main
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: resplan.txt
$ git commit --no-edit
[main 9330c17] Merge branch 'vasteras'

git commit --no-edit använder meddelandet som Git har fyllt i. Skriver du bara git commit öppnas texteditorn med samma meddelande, precis som vid git merge i förra lektionen.

1. När uppstår en merge-konflikt?
Visa rätt svar
  • När två grenar har ändrat samma rad på olika sätt: Git kan inte veta vilken version som ska gälla och låter dig bestämma.
2. I filen står "<<<<<<< HEAD", "Dag 2: Enköping", "=======", "Dag 2: Västerås" och ">>>>>>> vasteras". Var kommer "Dag 2: Enköping" ifrån?
Visa rätt svar
  • Från grenen du står på: Mellan <<<<<<< HEAD och ======= står versionen från HEAD, alltså grenen du står på.
3. Vilka steg behövs för att avsluta en sammanslagning med en konflikt? (Välj alla som stämmer)
Visa rätt svar
  • Bestämma vad som ska gälla och ta bort markeringarna i filen
  • Köra git add på filen: Så talar du om för Git att konflikten är löst.
  • Göra en commit
4. Du är osäker på hur konflikten ska lösas och vill börja om. Vad kör du?
Visa rätt svar
  • git merge --abort: Allt återställs till hur det var före git merge.

  • En konflikt uppstår när två grenar har ändrat samma rad på olika sätt. Det är inget fel.
  • Git skriver båda versionerna i filen, mellan <<<<<<<, ======= och >>>>>>>.
  • Lös konflikten: bestäm vad som ska gälla, ta bort markeringarna och spara.
  • Kör git add <fil> och sedan git commit för att avsluta sammanslagningen.
  • git merge --abort avbryter och återställer allt till hur det var före git merge.