
När du och en AI-agent har ändrat samma rader stannar git merge och skriver in båda versionerna i filen mellan konfliktmarkörer. Läs vilken sida som är vilken, skriv den rad du faktiskt vill ha, kontrollera att inga markörer finns kvar och avsluta med git add och git commit. Vill du inte fortsätta tar git merge --abort dig tillbaka till läget före mergen.
1. Varför mergen stannar
Du lät en AI-agent arbeta på en egen gren och ändrade samtidigt samma fil själv. Enligt manualen för git merge tar Git in ändringar som inte överlappar automatiskt. När båda sidor har ändrat samma område väljer Git inte en sida åt dig, utan ber dig lösa konflikten. Det är alltså inget fel i Git, utan ett beslut som bara du kan fatta.
Guiden gäller en vanlig git merge. Stannar en cherry-pick i stället har guiden om Git cherry-pick ett eget avsnitt om dess konflikter. Om du vill undvika att agenten och du skriver i samma arbetskatalog från början visar guiden om Git worktree hur du isolerar AI-arbetet. Konflikten uppstår ändå vid sammanslagningen om ni ändrat samma rader, men du slipper ändringar som blandas medan agenten arbetar.
Kör blocken i PowerShell, i ordning i samma fönster. Det första blocket skapar ett nytt repo med slumpat namn i din temporärmapp, utan fjärr och utan push. Funktionen GitOk stoppar om ett Git-kommando misslyckas. De två merge-kommandona körs utan den, eftersom ett stopp där är avsiktligt.
2. Skapa övningsrepot och konflikten
$ErrorActionPreference = 'Stop'
function GitOk { & git @args; if ($LASTEXITCODE -ne 0) { throw 'Git stoppade; undersok felet innan du fortsatter' } }
$provKatalog = Join-Path ([IO.Path]::GetTempPath()) ('merge-prov-' + [guid]::NewGuid().ToString('N'))
New-Item -ItemType Directory -Path $provKatalog | Out-Null
Set-Location -LiteralPath $provKatalog
$utf8 = New-Object System.Text.UTF8Encoding($false)
function Skriv([string]$text) { [IO.File]::WriteAllText("$provKatalog/kontakt.txt", $text, $utf8) }
GitOk --version
GitOk init --quiet -b main
GitOk config user.name 'Mergeprov'
GitOk config user.email 'mergeprov@example.invalid'
GitOk config core.autocrlf false
GitOk config core.hooksPath "$provKatalog/.git/empty-hooks"
Skriv "Rubrik: Kontakt`nText: Skriv ditt meddelande`nKnapp: Skicka`n"
GitOk add -- kontakt.txt
GitOk commit --quiet -m 'Bas for kontaktformular'
GitOk switch --quiet -c ai/agent
Skriv "Rubrik: Kontakt`nText: Skriv ditt meddelande (max 500 tecken)`nKnapp: Skicka`n"
GitOk commit --quiet -a -m 'AI: ange maxlangd'
GitOk switch --quiet main
Skriv "Rubrik: Kontakt`nText: Skriv ditt meddelande och din e-post`nKnapp: Skicka`n"
GitOk commit --quiet -a -m 'Be om e-post'
GitOk log --oneline --all --graph
Agentens gren ai/agent lägger till en maxlängd på textraden. På main ber du i stället om e-post på samma rad. Facit är en graf där Be om e-post och AI: ange maxlangd båda utgår från Bas for kontaktformular. Dina hashvärden blir andra än redaktionens.
3. Starta mergen och se vilka filer som är i konflikt
git merge ai/agent
if ($LASTEXITCODE -eq 0) { throw 'Forvantad konflikt saknas' }
GitOk status
GitOk status --short
Så här såg utdata ut i redaktionens körning med Git 2.53.0:
Auto-merging kontakt.txt
CONFLICT (content): Merge conflict in kontakt.txt
Automatic merge failed; fix conflicts and then commit the result.
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: kontakt.txt
no changes added to commit (use "git add" and/or "git commit -a")
UU kontakt.txt
Listan under Unmerged paths är din arbetslista: varje fil där behöver lösas. I kortformatet betyder UU enligt manualen för git status unmerged, both modified. Läs listan noga i ett verkligt projekt. En agent kan ha ändrat fler filer än den du tänker på, och git-status-manualen varnar för att långformatets text kan ändras mellan versioner.
4. Läs konfliktmarkörerna
Get-Content kontakt.txt
GitOk diff
GitOk show ':1:kontakt.txt'
Filen innehöll i redaktionens körning:
Rubrik: Kontakt
<<<<<<< HEAD
Text: Skriv ditt meddelande och din e-post
=======
Text: Skriv ditt meddelande (max 500 tecken)
>>>>>>> ai/agent
Knapp: Skicka
Manualen anger att konfliktområdet markeras med <<<<<<<, ======= och >>>>>>>, och att delen före ======= vanligen är din sida och delen efter den andra sidans. Här stod HEAD för main, grenen du stod på, och den andra sidan var märkt ai/agent. Rubrik och Knapp ligger utanför markörerna eftersom bara en eller ingen sida ändrade dem.
git diff visar enligt manualen en trevägsdiff med ändringar från både HEAD och den inkommande sidan. I körningen började utdata med diff --cc kontakt.txt, och varje rad hade två plus- eller mellanslagskolumner, en per sida. Det sista kommandot hämtar den gemensamma förfaderns version, alltså raden Text: Skriv ditt meddelande. Manualen anger :2: för HEAD och :3: för den inkommande sidan på samma sätt.
5. Kombinera båda ändringarna och kör testet
Att välja en sida rakt av vore fel här. Både e-posten och maxlängden är avsedda ändringar. Skriv därför en rad som bär båda, och ta bort alla tre markörraderna. Testet kontrollerar två saker: att inga markörer finns kvar och att båda ändringarna finns med.
Skriv "Rubrik: Kontakt`nText: Skriv ditt meddelande och din e-post (max 500 tecken)`nKnapp: Skicka`n"
$rader = Get-Content kontakt.txt
if ($rader -match '^(<<<<<<<|=======|>>>>>>>)') { throw 'Konfliktmarkorer finns kvar' }
if (-not ($rader -match 'e-post') -or -not ($rader -match 'max 500 tecken')) { throw 'En av andringarna saknas' }
'Test: OK'
Facit är raden Test: OK. I ditt eget projekt ersätter du detta med projektets egna tester. En fil utan markörer kan fortfarande vara fel om agentens kod och din kod fungerar var för sig men inte tillsammans.
6. Avsluta mergen med git add och git commit
GitOk add -- kontakt.txt
GitOk status --short
GitOk commit --quiet -m 'Merge ai/agent: e-post och maxlangd'
GitOk log --oneline --graph -4
Enligt manualen redigerar du filerna till rätt skick, lägger till dem med git add och avslutar med git commit eller git merge --continue. Det senare kontrollerar att en avbruten merge pågår innan det anropar git commit. Efter git add visade status M i stället för UU. Facit i loggen är en merge-commit med två föräldrar: grafen grenar ut under Merge ai/agent och möts igen vid basen.
Behöver du senare hitta tillbaka till läget före en merge som gick snett hjälper guiden om Git reflog.
7. Andra konflikten: se basen med zdiff3 och avbryt
Standardformatet visar enligt manualen inte vad originalet sa i konfliktområdet. Sätter du merge.conflictStyle till diff3 eller zdiff3 lägger Git till markören ||||||| följd av originaltexten. Med zdiff3 tas dessutom lika rader nära början eller slutet av området bort. Inställningen sätts här bara i övningsrepot.
GitOk switch --quiet -c ai/knapp
Skriv "Rubrik: Kontakt`nText: Skriv ditt meddelande och din e-post (max 500 tecken)`nKnapp: Skicka nu`n"
GitOk commit --quiet -a -m 'AI: kortare knapptext'
GitOk switch --quiet main
Skriv "Rubrik: Kontakt`nText: Skriv ditt meddelande och din e-post (max 500 tecken)`nKnapp: Skicka meddelande`n"
GitOk commit --quiet -a -m 'Tydligare knapp'
$foreMerge = git rev-parse HEAD
GitOk config merge.conflictStyle zdiff3
git merge ai/knapp
if ($LASTEXITCODE -eq 0) { throw 'Forvantad konflikt saknas' }
Get-Content kontakt.txt
Redaktionens fil, där hashen efter ||||||| pekade på den gemensamma basen:
Rubrik: Kontakt
Text: Skriv ditt meddelande och din e-post (max 500 tecken)
<<<<<<< HEAD
Knapp: Skicka meddelande
||||||| dc6fcd6
Knapp: Skicka
=======
Knapp: Skicka nu
>>>>>>> ai/knapp
Nu ser du att båda sidor utgick från Skicka och ändrade i olika riktning. Anta att du inte vill bestämma knapptexten nu. Avbryt i stället:
GitOk merge --abort
if ((git rev-parse HEAD) -ne $foreMerge) { throw 'HEAD andrades' }
GitOk status --short
Get-Content kontakt.txt
Manualen beskriver att git merge --abort avbryter konfliktlösningen och försöker återskapa läget före mergen. Facit är tom status, samma HEAD som före försöket och knappraden Skicka meddelande.
8. Innan nästa AI-merge
Hade du ocommittade ändringar när mergen startade kan git merge --abort enligt manualen i vissa fall inte återskapa dem. Manualen rekommenderar därför att alltid committa eller stasha före git merge. Guiden om git stash visar hur. Föredrar du ett grafiskt verktyg startar git mergetool ett sådant enligt manualen, men markörerna och testet är desamma. När du är klar: kontrollera sökvägen i $provKatalog och ta bort just den katalogen.
FAQ
Hur avbryter jag en merge i Git?
Kör git merge --abort. Manualen för git merge beskriver att kommandot avbryter konfliktlösningen och försöker återskapa läget före mergen. I guidens prov stod HEAD kvar på samma commit och git status --short var tom efteråt. Hade du ocommittade ändringar när mergen startade kan de i vissa fall inte återskapas, så committa eller stasha före git merge.
Vad betyder <<<<<<< HEAD?
Raden markerar början på ett konfliktområde. Enligt manualen för git merge är delen före ======= vanligen din sida och delen efter den andra sidans. I guidens prov stod HEAD för main, grenen du stod på, och den andra sidan var märkt ai/agent.
Hur ser jag vilka filer som har en merge-konflikt?
Kör git status. I guidens prov listades filen under Unmerged paths som both modified, och git status --short visade UU, som manualen för git status förklarar som unmerged, both modified. git diff visar sedan konfliktområdet med ändringar från båda sidor.
Hur ser jag basversionen i en merge-konflikt?
Sätt merge.conflictStyle till diff3 eller zdiff3, i guiden med git config merge.conflictStyle zdiff3 i övningsrepot. Då lägger Git till markören ||||||| följd av originaltexten, så att du ser vad båda sidor utgick från. Under en pågående konflikt visar git show :1:kontakt.txt den gemensamma förfaderns version.
Källor och genomfört prov
- Git merge – avsnitten How conflicts are presented och How to resolve conflicts, --abort, --continue och merge.conflictStyle. Manualen anger senaste ändring i Git 2.54.0 och är oförändrad till och med 2.56.0.
- Git status – kortformatets UU, unmerged, both modified.
Källorna kontrollerade 27 oktober 2026. Redaktionen körde hela kommandoflödet i PowerShell med Git 2.53.0.windows.2 samma dag; utdata ovan är från den körningen. Hashvärden blir andra hos dig. Filinnehållet och testet är konstruerade och ersätter inte projektets egna tester.