Hur man löser sammanfogningskonflikter i Git

Hur löser jag sammanfogningskonflikter i Git?

Lösning

Försök: git mergetool

Det öppnar ett grafiskt gränssnitt som visar dig hur du går igenom varje konflikt, och du kan välja hur du vill slå ihop den. Ibland krävs det lite handredigering efteråt, men oftast räcker det. Det är mycket bättre än att göra allt för hand säkert.

Enligt @JoshGlover kommentar:

Kommandot öppnar inte nödvändigtvis ett GUI om du inte installerar ett. Att köra git mergetool för mig resulterade i att vimdiff användes. Du kan installera ett av följande verktyg för att använda det istället: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Nedan följer en exempelprocedur för att använda vimdiff för att lösa sammanslagningskonflikter. Baserat på denna länk

Steg 1: Kör följande kommandon i din terminal

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

Detta kommer att ställa in vimdiff som standardverktyg för sammanslagning.

Steg 2: Kör följande kommando i terminalen

git mergetool

Steg 3: Du kommer att se en vimdiff-display i följande format

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

Dessa 4 vyer är

LOCAL - detta är filen från den aktuella grenen

BASE - gemensam förfader, hur filen såg ut före båda ändringarna

REMOTE - fil som du lägger samman i din gren.

MERGED - resultat av sammanslagningen, detta är vad som sparas i repo:n.

Du kan navigera mellan dessa vyer med ctrl+w. Du kan nå MERGED-vyn direkt genom att använda ctrl+w följt av j.

Mer information om vimdiff navigation här och här.

Steg 4. Du kan redigera MERGED-vyn på följande sätt

Om du vill hämta ändringar från REMOTE

:diffg RE  

Om du vill få ändringar från BASE

:diffg BA  

Om du vill få ändringar från LOCAL

:diffg LO 

Steg 5. Spara, avsluta, bekräfta och städa upp

:wqa spara och avsluta från vi

git commit -m "message"

git clean Ta bort extra filer (t.ex. *.orig) som skapats av diff-verktyget.

Kommentarer (20)
  1. Identifiera vilka filer som är i konflikt (Git borde berätta detta).

  2. Öppna varje fil och granska diffs; Git avgränsar dem. Förhoppningsvis är det uppenbart vilken version av varje block som ska behållas. Du kan behöva diskutera det med andra utvecklare som har lagt in koden.

  3. När du'har löst konflikten i en fil git add the_file.

  4. När du har löst alla konflikter gör du git rebase --continue eller vilket kommando som helst. Git sa att du skulle göra när du avslutade.

Kommentarer (7)

Om du ofta gör små commits börjar du med att titta på kommentarerna till commits med git log --merge. Sedan visar git diff dig konflikterna.

För konflikter som omfattar mer än några få rader är det lättare att se vad som händer i ett externt GUI-verktyg. Jag gillar opendiff -- Git stöder också vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box och du kan installera andra: git config merge.tool "your.tool" kommer att ställa in ditt valda verktyg och sedan kommer git mergetool efter en misslyckad sammanslagning att visa dig skillnaderna i sammanhanget.

Varje gång du redigerar en fil för att lösa en konflikt kommer git add filnamn att uppdatera indexet och din diff kommer inte längre att visa den. När alla konflikter är hanterade och deras filer har git add-redigerats, kommer git commit att slutföra din sammanslagning.

Kommentarer (1)