Slik løser du flettekonflikter i Git

Hvordan løser jeg flettekonflikter i Git?

Løsning

Prøv: git mergetool

Det åpner en GUI som tar deg gjennom hver konflikt, og du får velge hvordan du vil slå sammen. Noen ganger krever det litt håndredigering etterpå, men vanligvis er det nok av seg selv. Det er mye bedre enn å gjøre det hele for hånd absolutt.

Som per @JoshGlover kommentar:

Kommandoen åpner ikke nødvendigvis en GUI med mindre du installerer en. Å kjøre git mergetool for meg resulterte i at vimdiff ble brukt. Du kan installere et av følgende verktøy for å bruke det i stedet: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Nedenfor er eksempelprosedyren for å bruke vimdiff for å løse sammenslåingskonflikter. Basert på denne lenken

Trinn 1: Kjør følgende kommandoer i terminalen din

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

Dette vil sette vimdiff som standard fletteverktøy.

Trinn 2: Kjør følgende kommando i terminalen

git mergetool

Trinn 3: Du vil se en vimdiff-skjerm i følgende format

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

Disse 4 visningene er

LOCAL - dette er filen fra den aktuelle grenen

BASE - felles stamfar, hvordan filen så ut før begge endringer

REMOTE - filen du fletter inn i grenen din

MERGED - sammenslåingsresultat, dette er hva som blir lagret i repoen

Du kan navigere mellom disse visningene ved å bruke ctrl+w. Du kan gå direkte til MERGED-visningen ved å bruke ctrl+w etterfulgt av j.

Mer informasjon om vimdiff-navigasjon her og her.

Trinn 4. Du kan redigere MERGED-visningen på følgende måte

Hvis du ønsker å få endringer fra REMOTE

:diffg RE  

Hvis du ønsker å få endringer fra BASE

:diffg BA  

Hvis du ønsker å få endringer fra LOCAL

:diffg LO 

Trinn 5. Lagre, avslutte, bekrefte og rydde opp

:wqa lagre og avslutte fra vi

git commit -m "melding"

git clean Fjern ekstra filer (f.eks. *.orig) opprettet av diff-verktøyet.

Kommentarer (20)
  1. Identifiser hvilke filer som er i konflikt (Git skal fortelle deg dette).

  2. Åpne hver fil og undersøk forskjellene; Git avgrenser dem. Forhåpentligvis vil det være åpenbart hvilken versjon av hver blokk som skal beholdes. Du må kanskje diskutere det med andre utviklere som har lagt inn koden.

  3. Når du har løst konflikten i en fil git add the_file.

  4. Når du har løst alle konflikter, gjør git rebase --continue eller hvilken som helst kommando Git sa du skulle gjøre når du var ferdig.

Kommentarer (7)

Hvis du gjør hyppige små commits, så start med å se på commit-kommentarene med git log --merge. Da vil git diff vise deg konfliktene.

For konflikter som involverer mer enn noen få linjer, er det lettere å se hva som skjer i et eksternt GUI-verktøy. Jeg liker opendiff - Git støtter også vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, dukker opp ut av esken, og du kan installere andre: git config merge.tool "your.tool" vil sette ditt valgte verktøy og deretter git mergetool etter en mislykket sammenslåing vil vise deg diffene i sammenheng.

Hver gang du redigerer en fil for å løse en konflikt, vil git add filename oppdatere indeksen, og diffen vil ikke lenger vise den. Når alle konfliktene er håndtert og filene har blitt git add-ed, vil git commit fullføre sammenslåingen.

Kommentarer (1)