Jak řešit konflikty sloučení v systému Git

Jak vyřešit konflikty sloučení v systému Git?

Řešení

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.

Komentáře (20)
  1. Zjistěte, které soubory jsou v konfliktu (Git by vám to měl říct).

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

  3. Jakmile'vyřešíte konflikt v souboru, git add the_file.

  4. 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í.

Komentáře (7)

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

Komentáře (1)