Hvordan løser jeg sammenlægningskonflikter i Git?
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.
Identificer hvilke filer der er i konflikt (Git burde fortælle dig dette).
Å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.
Når du'har løst konflikten i en fil git add the_file
.
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.
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.