Kako rešim konflikte pri združevanju v sistemu Git?
Poskusite: git mergetool
Odpre se grafični uporabniški vmesnik, ki vas vodi skozi vsak konflikt, vi pa lahko izberete način združevanja. Včasih je potrebno naknadno ročno urejanje, vendar običajno zadostuje že samo po sebi. Vsekakor je veliko boljši kot ročno opravljanje celotne zadeve.
V skladu s komentarjem @JoshGlover:
Ukaz ne odpre nujno grafičnega uporabniškega vmesnika, razen če ga namestite. Pri meni se je ob zagonu git mergetool
uporabil vimdiff
. Namesto tega lahko namestite eno od naslednjih orodij: meld
, opendiff
, kdiff3
, tkdiff
, xxdiff
, tortoisemerge
, gvimdiff
, diffuse
, ecmerge
, p4merge
, araxis
, vimdiff
, emerge
.
Spodaj je prikazan vzorčni postopek za uporabo vimdiff
za reševanje konfliktov pri združevanju. Na podlagi ta povezava
Korak 1: V terminalu zaženite naslednje ukaze
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
To bo nastavilo vimdiff kot privzeto orodje za združevanje.
Korak 2: V terminalu zaženite naslednji ukaz
git mergetool
Korak 3: Videli boste prikaz vimdiff v naslednji obliki
╔═══════╦══════╦════════╗
║ ║ ║ ║
║ LOCAL ║ BASE ║ REMOTE ║
║ ║ ║ ║
╠═══════╩══════╩════════╣
║ ║
║ MERGED ║
║ ║
╚═══════════════════════╝
Ti 4 prikazi so
LOCAL - to je datoteka iz trenutne veje
BASE - skupni prednik, kako je bila datoteka videti pred obema spremembama
REMOTE - datoteka, ki jo združujete v svojo vejo
MERGED - rezultat združitve, ki se shrani v repu
Med temi pogledi se lahko pomikate z uporabo ctrl+w. Do pogleda MERGED lahko pridete neposredno z uporabo ctrl+w, ki mu sledi j.
Več informacij o navigaciji vimdiff tukaj in tukaj
Korak 4. Pogled MERGED lahko uredite na naslednji način
Če želite pridobiti spremembe iz oddaljenega
:diffg RE
Če želite pridobiti spremembe iz BASE
:diffg BA
Če želite pridobiti spremembe iz LOCAL
:diffg LO
Korak 5. Shranite, zaključite, zavežite in počistite
:wqa
shranite in izstopite iz vi
git commit -m "message"
git clean
Odstrani dodatne datoteke (npr. *.orig), ki jih je ustvarilo orodje za razlikovanje.
Ugotovite, katere datoteke so v konfliktu (Git vam mora to povedati).
Odprite vsako datoteko in preglejte razlike; Git jih razmejuje. Upajmo, da bo očitno, katero različico vsakega bloka je treba ohraniti. Morda se boste morali o tem pogovoriti s kolegi razvijalci, ki so oddali kodo.
Ko ste razrešili konflikt v datoteki, git add the_file
.
Ko ste razrešili vse konflikte, naredite git rebase --continue
ali katerikoli drug ukaz
Git rekel, da ga morate narediti, ko ste končali.
Če pogosto delate manjše spremembe, si najprej oglejte komentarje sprememb z git log --merge
. Nato vam bo git diff
pokazal konflikte.
Za konflikte, ki vključujejo več kot nekaj vrstic, je lažje videti, kaj se dogaja, v zunanjem orodju z grafičnim vmesnikom. Všeč mi je opendiff -- Git podpira tudi vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge, lahko pa namestite tudi druge: git config merge.tool "your.tool"
bo nastavil izbrano orodje, nato pa vam bo git mergetool
po neuspešnem združevanju pokazal razlike v kontekstu.
Vsakič, ko uredite datoteko, da bi rešili konflikt, bo git add filename
posodobil indeks in vaš razlikovanje ne bo več prikazano. Ko so vsi konflikti odpravljeni in so njihove datoteke git add
urejene, bo git commit
dokončal združitev.