== Tutorial 9 - Slučování konfliktních změn == ''Předchozí kapitolou [[CzechTutorial|Tutoriálu]] je [[CzechTutorialMerge|Slučování změn]], následující je [[CzechTutorialConclusion|Závěr]]'' V předchozí kapitole jsme se naučili provádět jednoduchá [[Merge|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 [[Conflict|konflikty]] a jejich rozplétání se nazývá [[ResolveConflict|ř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ě: {{{#!cplusplus numbers=off 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 [[CzechTutorialFirstChange|Naše první změna]] jsme vytvořili [[ChangeSet|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 [[TutorialMerge|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 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 [[CzechTutorialConclusion|Závěr]]. ---- CategoryCzech