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.


CategoryCzech

CzechTutorialConflict (last edited 2013-11-15 21:09:32 by Tovim)