Jak vyřešit konflikty sloučení v systému Git?
Vyzkoušejte: git mergetool
Otevře se grafické rozhraní, které vás provede každým konfliktem a vy si můžete vybrat, jakým způsobem se má sloučit. Někdy to vyžaduje následnou ruční úpravu, ale obvykle to stačí samo. Je to určitě mnohem lepší než dělat celou věc ručně.
Podle komentáře @JoshGlover:
Příkaz nemusí nutně otevřít grafické uživatelské rozhraní, pokud si ho nenainstalujete. Spuštění git mergetool
u mě vedlo k použití vimdiff
. Místo toho si můžete nainstalovat některý z následujících nástrojů: meld
, opendiff
, kdiff3
, tkdiff
, xxdiff
, tortoisemerge
, gvimdiff
, diffuse
, ecmerge
, p4merge
, araxis
, vimdiff
, emerge
.
Níže je uveden ukázkový postup použití vimdiff
pro řešení konfliktů sloučení. Na základě tohoto odkazu
Krok 1: Spusťte následující příkazy v terminálu
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
Tím nastavíte vimdiff jako výchozí nástroj pro slučování.
Krok 2: V terminálu spusťte následující příkaz
git mergetool
Krok 3: Zobrazí se vimdiff v následujícím formátu
╔═══════╦══════╦════════╗
║ ║ ║ ║
║ LOCAL ║ BASE ║ REMOTE ║
║ ║ ║ ║
╠═══════╩══════╩════════╣
║ ║
║ MERGED ║
║ ║
╚═══════════════════════╝
Tyto 4 zobrazení jsou
LOCAL - jedná se o soubor z aktuální větve
BASE - společný předek, jak soubor vypadal před oběma změnami
REMOTE - soubor, který začleňujete do své větve
MERGED - výsledek sloučení, to je to, co se uloží do repozitáře
Mezi těmito zobrazeními se můžete pohybovat pomocí ctrl+w. Do zobrazení MERGED se dostanete přímo pomocí ctrl+w a následně j.
Více informací o navigaci vimdiff zde a zde.
Krok 4. Zobrazení MERGED můžete upravit následujícím způsobem
Pokud chcete získat změny z REMOTE
:diffg RE
Pokud chcete získat změny z BASE
:diffg BA
Pokud chcete získat změny z LOCAL
:diffg LO
Krok 5. Uložit, ukončit, odevzdat a vyčistit
:wqa
uložte a ukončete vi
git commit -m "message"
git clean
Odstranění přebytečných souborů (např. *.orig) vytvořených nástrojem diff.
Zjistěte, které soubory jsou v konfliktu (Git by vám to měl říct).
Otevřete každý soubor a prozkoumejte rozdíly; Git je vymezí. Doufejme, že bude zřejmé, kterou verzi každého bloku zachovat. Možná budete muset diskutovat s kolegy vývojáři, kteří kód odevzdali.
Jakmile'vyřešíte konflikt v souboru, git add the_file
.
Jakmile jste vyřešili všechny konflikty, proveďte git rebase --continue
nebo jiný příkaz.
Git řekl, že máte provést po dokončení.
Pokud často provádíte malé revize, začněte tím, že se podíváte na komentáře k revizím pomocí git log --merge
. Pak vám git diff
ukáže konflikty.
U konfliktů, které zahrnují více než několik řádků, je snazší zjistit, co se děje, v externím nástroji s grafickým uživatelským rozhraním. Mám rád opendiff -- Git také podporuje vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box a můžete si nainstalovat další: git config merge.tool "your.tool"
nastaví zvolený nástroj a git mergetool
vám po neúspěšném sloučení ukáže rozdíly v kontextu.
Pokaždé, když upravíte soubor, abyste vyřešili konflikt, git add filename
aktualizuje index a váš diff se již nezobrazí. Jakmile jsou všechny konflikty vyřešeny a jejich soubory jsou git add
-ovány, git commit
dokončí vaše sloučení.