Merge-konflikter
Det här lär du dig
Section titled “Det här lär du dig”- 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.
Varför behövs det här?
Section titled “Varför behövs det här?”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.
Så hänger det ihop
Section titled “Så hänger det ihop”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:
<<<<<<< HEADdin version, från grenen du står på=======den andra grenens version>>>>>>> namnet på den andra grenenExempel
Section titled “Exempel”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:
$ git merge vasterasAuto-merging resplan.txtCONFLICT (content): Merge conflict in resplan.txtAutomatic merge failed; fix conflicts and then commit the result.git status visar vilken fil som har en konflikt, och vad du kan göra:
$ git statusOn branch mainYou 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 sommaren 2027
Dag 1: Stockholm<<<<<<< HEADDag 2: Enköping=======Dag 2: Västerås>>>>>>> vasterasDag 3: GävleDag 4: SundsvallResten 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 sommaren 2027
Dag 1: StockholmDag 2: VästeråsDag 3: GävleDag 4: SundsvallTala om för Git att konflikten är löst med git add, och avsluta sammanslagningen med en commit:
$ git add resplan.txt$ git statusOn branch mainAll 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.
Övning
Section titled “Övning”Vanliga problem
Section titled “Vanliga problem”Testa dig själv
Section titled “Testa dig själv”Sammanfattning
Section titled “Sammanfattning”- 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 sedangit commitför att avsluta sammanslagningen. git merge --abortavbryter och återställer allt till hur det var föregit merge.