Sådan løser du sammenlægningskonflikter i Git

Hvordan løser jeg sammenlægningskonflikter i Git?

Løsning

Prøv: git mergetool

Det åbner en GUI, der fører dig gennem hver enkelt konflikt, og du kan selv vælge, hvordan du vil sammenføje. Nogle gange kræver det en smule håndredigering bagefter, men som regel er det nok i sig selv. Det er i hvert fald meget bedre end at gøre det hele i hånden.

Som pr @JoshGlover kommentar:

Kommandoen doesn't nødvendigvis åbne en GUI, medmindre du installerer en. At køre git mergetool for mig resulterede i at vimdiff blev brugt. Du kan installere et af følgende værktøjer for at bruge det i stedet: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Nedenfor er et eksempel på en procedure til at bruge vimdiff til at løse sammenlægningskonflikter. Baseret på dette link

Stræk 1: Kør følgende kommandoer i din terminal

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

Dette vil indstille vimdiff som standard sammenlægningsværktøj.

Strin 2: Kør følgende kommando i terminalen

git mergetool

Strg 3: Du vil se et vimdiff display i følgende format

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

Disse 4 visninger er

LOCAL - dette er filen fra den aktuelle gren

BASE - fælles forfader, hvordan filen så ud før begge ændringer

REMOTE - fil, som du fletter ind i din gren

MERGED - sammenlægningsresultatet, det er det, der bliver gemt i repo'en

Du kan navigere mellem disse visninger ved hjælp af ctrl+w. Du kan komme direkte til MERGED-visning ved at bruge ctrl+w efterfulgt af j.

Mere info om vimdiff navigation her og her

Stræk 4. Du kan redigere MERGED-visningen på følgende måde

Hvis du ønsker at få ændringer fra REMOTE

:diffg RE  

Hvis du ønsker at hente ændringer fra BASE

:diffg BA  

Hvis du ønsker at hente ændringer fra LOCAL

:diffg LO 

Stræk 5. Gem, Afslut, Indberet og Ryd op

:wqa gemme og afslutte fra vi

git commit -m "message"

git clean Fjern ekstra filer (f.eks. *.orig) skabt af diff-værktøjet.

Kommentarer (20)
  1. Identificer hvilke filer der er i konflikt (Git burde fortælle dig dette).

  2. Åbn hver fil og undersøg diffs; Git afgrænser dem. Forhåbentlig vil det være indlysende, hvilken version af hver blok du skal beholde. Det kan være nødvendigt at diskutere det med andre udviklere, der har commitet 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, skal du lave git rebase --continue eller en anden kommando Git sagde, du skulle gøre, da du afsluttede.

Kommentarer (7)

Hvis du ofte laver små commits, kan du starte med at kigge på commit-kommentarerne med git log --merge. Derefter vil git diff vise dig konflikterne.

For konflikter, der involverer mere end et par linjer, er det nemmere at se hvad der foregår i et eksternt GUI-værktøj. Jeg kan godt lide opendiff -- Git understøtter også vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box, og du kan installere andre: git config merge.tool "your.tool" vil indstille det valgte værktøj, og derefter vil git mergetool efter en mislykket sammenlægning vise dig diffs i kontekst.

Hver gang du redigerer en fil for at løse en konflikt, vil git add filnavn opdatere indekset, og din diff vil ikke længere vise den. Når alle konflikterne er håndteret og deres filer er blevet git add-ed, vil git commit afslutte din sammenlægning.

Kommentarer (1)