Tutorial 8 - Slučování konfliktních změn
(Předchozí částí Tutoriulu je TutorialMerge, následující částí je TutorialConclusion)
V TutorialMerge 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í.
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 mojeHalo-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 mojeHalo-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 předáme (commit) změny:
> hg commit -m "Díky, že mne kulka minula!"
Vzpomeňme si, že v TutorialFirstChange jsme vytvořili changeset v mojeHalo-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 ../mojeHalo-output pulling from ../mojeHalo-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)
'Poznámka:' V programu TortiseHg zní komentář v závorce odlišně (run 'hg update' to get a working copy) a zadaný příkaz 'hg update' spustí vestavěnou aplikaci 'KDiff3', která otevře okno se třemi panely, ve kterých lze konflikt vyřešit.
V programu Mercurial bez aktivované extenze má příkaz 'hg update' vývoj odlišný:
> hg update abort: crosses branches (use 'hg merge' or 'hg update -C')
Stejně jako v TutorialMerge, 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 TutorialConclusion.