Tutorial 9 - Slučování konfliktních změn
Předchozí kapitolou Tutoriálu je Slučování změn, následující je Závěr
V předchozí kapitole jsme se naučili provádět jednoduchá sloučení změn.
Mercurial umí ošetřit i složitější případy. Je docela běžné, že dva lidé upravují stejný řádek v souboru a potom se potřebují nějak dohodnout, jak se s variantami téhož řádku naloži. Takovéto situace jsou označovány jako konflikty a jejich rozplétání se nazývá řešení konfliktu.
Připravme si záměrně konfliktní situaci. Stejně jako předešle začneme tím, že si vytvoříme klon adresáře mojeHalo:
> cd .. > hg clone mojeHalo moje-halo-notcvs updating working directory 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Nyní přidáme další řádek na výstupu ze souboru hello.c:
> cd moje-halo-notcvs > notepad++ hello.c
Změníme funkci main následovně:
int main(int argc, char **argv)
{
printf("hello, world!\n");
printf("to jsem rád, že nepoužívám CVS!\n");
return 0;
}
Uložíme, zavřeme a komitujeme změny:
> hg commit -m "Díky, že mne kulka minula!"
Vzpomeňme si, že v Naše první změna jsme vytvořili changeset v moje-halo-output, kde byl rovněž přidán řádek do výstupu. Co se stane, když si tento adresář přitáhnem příkazem pull do aktuálního adresáře?
> hg pull ../moje-halo-output pulling from ../moje-halo-output searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge)
Zkusme příkaz update:
> hg update abort: crosses branches (use 'hg merge' or 'hg update -C')
Stejně jako ve Slučování změn, musíme zadat příkaz hg merge. Ten nepůjde provést automaticky, protože stejný řádek téhož zdrojového souboru byl v obou changesech upraven rozdílně.
> hg merge
Nyní záleží na tom, jak je Mercurial nakonfigurován (viz MergeToolConfiguration). Počáteční nastavení je takové, že se vloží markery do slučovaných souborů:
/* * hello.c * * Placed in the public domain by Bryan O'Sullivan * * This program is not covered by patents in the United States or other * countries. */ #include <stdio.h> int main(int argc, char **argv) { printf("hello, world!\n"); <<<<<<< local printf("to jsem rád, že nepoužívám CVS!\n"); ======= printf("to jsem rád, že mám Merkuriál!\n"); >>>>>>> other return 0; }
Oznámení o existenci těchto souborů si můžem stejně jako minule vyvolat příkazem hg status, uvědomujíce si, že Mercurial uložil kopii originálu předtím než vložil markery konfliktu:
> hg status M hello.c ? hello.c.orig
Konflikt vyřešíme tak, že otevřeme 'hello.c' v editoru, smažeme markery konfliktu a upravíme či vymažeme větu o CVS. Uložíme a zavřeme editor.
Dále oznámíme programu Mercurial, že jsme konflikt vyřešili:
> hg resolve -m hello.c
Mercurial přijme naše rozřešení bez zjevné odezvy.
Po skončeném slučování nezapomeneme změnu předat repozitáři:
> hg commit -m "Sloučené změny z mojeHalo-output"
Jak už bylo zmíněno, chování Mercurialu lze konfigurací různě měnit. Můžeme si nastavit oblíbený editor nebo umožnit činnost externí aplikace pro slučování (např. KDiff3). Informace lze nalézt v MergeToolConfiguration.
Nyní se přesuneme k závěrečné kapitole Závěr.