Hvordan løser jeg flettekonflikter i Git?
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.
Identifiser hvilke filer som er i konflikt (Git skal fortelle deg dette).
Å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.
Når du har løst konflikten i en fil git add the_file
.
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.
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.