Hoe samenvoeg conflicten op te lossen in Git

Hoe los ik samenvoeg conflicten op in Git?

Oplossing

Probeer: git mergetool

Het opent een GUI die je door elk conflict leidt, en je kunt kiezen hoe je samenvoegt. Soms vereist het een beetje handwerk achteraf, maar meestal is het genoeg. Het is in ieder geval veel beter dan alles met de hand te doen.

Zoals @JoshGlover opmerkt:

Het commando opent niet noodzakelijkerwijs een GUI tenzij je er een installeert. Het uitvoeren van git mergetool resulteerde bij mij in het gebruik van vimdiff. Je kunt een van de volgende tools installeren om het in plaats daarvan te gebruiken: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Hieronder staat een voorbeeld procedure om vimdiff te gebruiken om samenvoeg conflicten op te lossen. Gebaseerd op deze link

Stap 1: Voer de volgende commando's uit in uw terminal

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

Dit zal vimdiff instellen als het standaard samenvoeggereedschap.

Stap 2: Voer het volgende commando uit in terminal

git mergetool

Stap 3: U zult een vimdiff scherm zien in de volgende opmaak

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

Deze 4 weergaven zijn

LOCAL - dit is het bestand van de huidige tak

BASE - gemeenschappelijke voorouder, hoe het bestand eruit zag voor beide veranderingen

REMOTE - bestand dat je samenvoegt in je tak

MERGED - resultaat van de samenvoeging, dit is wat in de repo wordt opgeslagen

Je kunt tussen deze views navigeren met ctrl+w. Je kan rechtstreeks naar MERGED view gaan met ctrl+w gevolgd door j.

Meer info over vimdiff navigatie hier en hier

Stap 4. Je zou de MERGED view op de volgende manier kunnen bewerken

Als je wijzigingen wilt krijgen van REMOTE

:diffg RE  

Als u wijzigingen wilt ontvangen van BASE

:diffg BA  

Als u wijzigingen van LOCAL wilt opvragen

:diffg LO 

Stap 5. Opslaan, afsluiten, vastleggen en opruimen

:wqa opslaan en afsluiten van vi

git commit -m "message"

git clean Verwijder extra bestanden (b.v. *.orig) gemaakt door diff tool.

Commentaren (20)
  1. Identificeer welke bestanden in conflict zijn (Git zou je dit moeten vertellen).

  2. Open elk bestand en bekijk de diffs; Git bakent ze af. Hopelijk is het duidelijk welke versie van elk blok je moet houden. Misschien moet je het bespreken met mede ontwikkelaars die de code gecommit hebben.

  3. Zodra je'het conflict in een bestand hebt opgelost git add the_file.

  4. Als je alle conflicten hebt opgelost, doe dan git rebase --continue of welk commando Git zei te doen toen je klaar was.

Commentaren (7)

Als je regelmatig kleine commits maakt, begin dan met het bekijken van de commit commentaren met git log --merge. Dan zal git diff je de conflicten laten zien.

Voor conflicten die meer dan een paar regels omvatten, is het makkelijker om te zien wat er aan de hand is in een extern GUI gereedschap. Ik hou van opendiff -- Git ondersteunt ook vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box en je kunt anderen installeren: git config merge.tool "your.tool" zal je gekozen tool instellen en dan zal git mergetool na een mislukte samenvoeging je de diffs in context laten zien.

Elke keer dat je een bestand bewerkt om een conflict op te lossen, zal git add filename de index bijwerken en je diff zal het niet langer laten zien. Als alle conflicten zijn afgehandeld en hun bestanden zijn git add-ed, zal git commit de samenvoeging voltooien.

Commentaren (1)