Ako vyriešim konflikty pri zlučovaní v systéme Git?
Skúste: git mergetool
Otvorí sa grafické rozhranie, ktoré vás prevedie každým konfliktom a vy si môžete vybrať spôsob zlúčenia. Niekedy si to potom vyžaduje trochu ručnej úpravy, ale zvyčajne to stačí samo. Je to určite oveľa lepšie ako robiť to celé ručne.
Podľa komentára @JoshGlover:
Príkaz nemusí nevyhnutne otvoriť grafické rozhranie, pokiaľ si ho nenainštalujete. Spustenie git mergetool
u mňa viedlo k použitiu vimdiff
. Namiesto neho si môžete nainštalovať jeden z nasledujúcich nástrojov: meld
, opendiff
, kdiff3
, tkdiff
, xxdiff
, tortoisemerge
, gvimdiff
, diffuse
, ecmerge
, p4merge
, araxis
, vimdiff
, emerge
.
Nižšie je uvedený vzorový postup na použitie vimdiff
na riešenie konfliktov pri zlučovaní. Na základe tohto odkazu
Krok 1: Spustite nasledujúce príkazy v termináli
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
Tým sa nastaví vimdiff ako predvolený nástroj na spájanie.
Krok 2: V termináli spustite nasledujúci príkaz
git mergetool
Krok 3: Zobrazí sa vimdiff v nasledujúcom formáte
╔═══════╦══════╦════════╗
║ ║ ║ ║
║ LOCAL ║ BASE ║ REMOTE ║
║ ║ ║ ║
╠═══════╩══════╩════════╣
║ ║
║ MERGED ║
║ ║
╚═══════════════════════╝
Tieto 4 zobrazenia sú
LOCAL - toto je súbor z aktuálnej vetvy
BASE - spoločný predok, ako súbor vyzeral pred oboma zmenami
REMOTE - súbor, ktorý začleňujete do svojej vetvy
MERGED - výsledok zlúčenia, to je to, čo sa uloží do repozitára
Medzi týmito zobrazeniami sa môžete pohybovať pomocou ctrl+w. Do pohľadu MERGED sa dostanete priamo pomocou ctrl+w a následne j.
Viac informácií o navigácii vimdiff tu a tu
Krok 4. Zobrazenie MERGED by ste mohli upraviť nasledujúcim spôsobom
Ak chcete získať zmeny z REMOTE
:diffg RE
Ak chcete získať zmeny z BASE
:diffg BA
Ak chcete získať zmeny z LOCAL
:diffg LO
Krok 5. Uložiť, ukončiť, odovzdať a vyčistiť
:wqa
uložte a ukončite vi
git commit -m "message"
git clean
Odstráňte dodatočné súbory (napr. *.orig) vytvorené nástrojom diff.
Zistite, ktoré súbory sú v konflikte (Git by vám to mal povedať).
Otvorte každý súbor a preskúmajte rozdiely; Git ich vymedzuje. Dúfajme, že bude zrejmé, ktorú verziu každého bloku ponechať. Možno budete musieť diskutovať s kolegami vývojármi, ktorí kód odovzdali.
Po'vyriešení konfliktu v súbore git add the_file
.
Keď'ste vyriešili všetky konflikty, vykonajte git rebase --continue
alebo iný príkaz
Git povedal, že máte vykonať po dokončení.
Ak často robíte malé revízie, začnite tým, že sa pozriete na komentáre revízií pomocou príkazu git log --merge
. Potom vám git diff
ukáže konflikty.
Pri konfliktoch, ktoré zahŕňajú viac ako niekoľko riadkov, je jednoduchšie zistiť, čo sa deje, v externom nástroji s grafickým rozhraním. Mne sa páči opendiff -- Git podporuje aj vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box a môžete si nainštalovať ďalšie: git config merge.tool "your.tool"
nastaví zvolený nástroj a potom git mergetool
po neúspešnom zlúčení zobrazí rozdiely v kontexte.
Pri každej úprave súboru na vyriešenie konfliktu git add filename
aktualizuje index a váš diff sa už nebude zobrazovať. Keď sú všetky konflikty vyriešené a ich súbory boli git add
-ované, git commit
dokončí vaše zlučovanie.