Hoe los ik samenvoeg conflicten op in Git?
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.
Identificeer welke bestanden in conflict zijn (Git zou je dit moeten vertellen).
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.
Zodra je'het conflict in een bestand hebt opgelost git add the_file
.
Als je alle conflicten hebt opgelost, doe dan git rebase --continue
of welk commando
Git zei te doen toen je klaar was.
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.