Hvordan løser jeg sammenlægningskonflikter i Git?


Sådan løser du 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](http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/#fromHistor)


**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](https://stackoverflow.com/questions/4556184/vim-move-window-left-right) og [her](https://stackoverflow.com/questions/27151456/how-do-i-jump-to-the-next-prev-diff-in-git-difftool)


**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.


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.

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.

