Merge-konflikt
Vad som händer
En merge-konflikt uppstår när Git inte kan slå ihop två versioner av samma fil automatiskt. Det händer när du och någon annan (eller du på två ställen) har ändrat samma rad i samma fil, och Git inte vet vilken version som ska gälla.
git pull
# Output vid konflikt:CONFLICT (content): Merge conflict in Program.csAutomatic merge failed; fix conflicts and then commit the result.flowchart LR
A[Kollega A ändrar rad 5] --> C[(GitHub)]
B[Kollega B ändrar rad 5] --> C
C -->|git pull| D[💥 Merge-konflikt\nGit vet inte vilket som gäller]
style A fill:#f0f0f0,stroke:#888,color:#111
style B fill:#f0f0f0,stroke:#888,color:#111
style C fill:#1565c0,stroke:#0d47a1,color:#fff
style D fill:#b71c1c,stroke:#7f0000,color:#fff
Konfliktmarkering
När en merge-konflikt uppstår lägger Git in markeringar direkt i filen för att visa de två versionerna:
<<<<<<< HEADConsole.WriteLine("Vi gör det tillsammans. Det är vad ett team gör.");=======Console.WriteLine("Vi löser det här på egen hand.");>>>>>>> origin/main| Markering | Vad den betyder |
|---|---|
<<<<<<< HEAD | Din version börjar här |
======= | Skiljelinjen mellan de två versionerna |
>>>>>>> origin/main | Serverns version slutar här |
Du måste manuellt välja vad filen ska innehålla och ta bort alla tre markeringarna. De ska inte vara kvar i slutresultatet.
Tre sätt att lösa:
Behåll din version — ta bort serverns del och markeringarna:
Console.WriteLine("Vi gör det tillsammans. Det är vad ett team gör.");Behåll serverns version — ta bort din del och markeringarna:
Console.WriteLine("Vi löser det här på egen hand.");Kombinera båda — ta bort markeringarna, behåll båda raderna:
Console.WriteLine("Vi gör det tillsammans. Det är vad ett team gör.");Console.WriteLine("Vi löser det här på egen hand.");I VS Code och Rider syns konfliktmarkeringarna med knappar ovanför: Accept Current Change, Accept Incoming Change, Accept Both Changes. Använd knapparna — det är lättare än att redigera markeringarna för hand.
Lösa en konflikt (ritualen)
När du har redigerat filen och tagit bort alla konfliktmarkeringar:
git status # verifiera — ska inte visa "both modified"git add Program.cs # markera filen som löstgit commit -m "Löste konflikt i Program.cs"git pushflowchart TD
A[git pull → konflikt] --> B[Öppna filen\nredigera bort markeringarna]
B --> C[git add filnamn.cs]
C --> D[git commit -m 'Löste konflikt...']
D --> E[git push]
style A fill:#b71c1c,stroke:#7f0000,color:#fff
style E fill:#1565c0,stroke:#0d47a1,color:#fff
git status visar both modified så länge konflikten finns kvar. Efter git add är den markerad som löst.
git merge —abort
Ångrar ett pågående merge-försök och återställer koden till läget precis innan git pull. Användbart om konflikten är förvirrande och du vill börja om med klarare huvud.
git merge --abortFungerar bara om du inte redan kört git add och git commit på konflikten. Kör du den efter commit händer ingenting — commiten är redan gjord.
När använder man det?
- Du körde
git pulloch fick fem konflikter i filer du inte förstår - Du vill prata med en kollega om hur filerna ska slås ihop innan du bestämmer dig
- Du råkade köra
git pullpå fel branch
Efter git merge --abort kan du köra git status och se att allt är tillbaka till normalt.
“both modified”
Det Git skriver i git status när en fil har en olöst merge-konflikt:
git status
# Output:Unmerged paths: (use "git add <file>..." to mark resolution) both modified: Program.csboth modified = du och någon annan har båda ändrat filen. Git väntar på att du löser konflikten och kör git add.