Tutoriál 8 - Slučování změn

Předchozí kapitolou Tutoriálu je Export změny do souboru, následující je Řešení konfliktu

V předchozí kapitole jsme se dozvěděli, jak sdílet změny prostřednictvím emailu s jinou osobou. V této části si ukážeme slučování (merge) změn, stažených příkazem pull z jiného repozitáře.

Nejprve si musíme vytvořit něco, co bychom mohli slučovat. Proveďme si další klon adresáře moje-halo:

> cd ..
> hg clone moje-halo moje-halo-desc
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved

Do souboru hello.c doplníme popisný text.

> cd moje-halo-desc
> notepad++ hello.c

Změňme druhý řádek:

 * hello.c

na:

 * hello.c - hello, world

Změnu uložíme, zavřeme editor a změnu komitujeme. Tentokrát to provedeme s volbou -m k příkazu commit, čímž vypustíme ze hry editor:

$ hg commit -m "Doplněn popis hello.c"

V tomto okamžiku máme jednu změnu souboru hello.c v adresáři moje-halo-output a druhou změnu v adresáři moje-halo-desc. Jak "sloučíme" tyto dvě odlišné linie vývoje? Vznikne nějaký problém, když se pokusíme stáhnout (pull) jednu do druhé?

Se samotným stažením nebude problém. Jsa stále v moje-halo-desc, proveďme stažení změn z moje-halo-output a hleďme, co se stane:

> 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)

Mercurial nám říká, že přidal další čelo (head) do našeho repozitáře. Také nás nabádá, abychom si je prohlédli a abychom provedli sloučení:

> hg heads
changeset:   3:86794f718fb1
tag:         tip
parent:      1:82e55d328c8c
user:        mpm@selenic.com
date:        Mon May 05 01:20:46 2008 +0200
summary:     Ať žije DVCS Hg Merkuriál!

changeset:   2:c3844fde99f0
user:        mpm@selenic.com
date:        Tue May 06 20:10:35 2008 +0200
summary:     Doplněn popis hello.c

Součástí Mercurialu je pěkné rozšíření (extension) které umí zobrazit graf historie repozitáře ve formátu ASCII: GraphlogExtension. Nastavení této extenze se provede tak, že se povolí v konfiguračním souboru ~/.hgrc (nebo Mercurial.ini ve Windows) nebo přídá řádek hgext.graphlog = v sekci [extensions]:

[extensions]
hgext.graphlog =  # případně jen graphlog =

Pokud jsme si extenzi aktivovali, máme přístupný další příkaz glog (viz také hg help glog):

> hg glog
o  changeset:   3:86794f718fb1
|  tag:         tip
|  parent:      1:82e55d328c8c
|  user:        mpm@selenic.com
|  date:        Mon May 05 01:20:46 2008 +0200
|  summary:     Ať žije DVCS Hg Merkuriál!
|
| @  changeset:   2:c3844fde99f0
|/   user:        mpm@selenic.com
|    date:        Tue May 06 20:10:35 2008 +0200
|    summary:     Doplněn popis hello.c
|
o  changeset:   1:82e55d328c8c
|  user:        mpm@selenic.com
|  date:        Fri Aug 26 01:21:28 2005 -0700
|  summary:     Create a makefile
|
o  changeset:   0:0a04b987be5a
   user:        mpm@selenic.com
   date:        Fri Aug 26 01:20:50 2005 -0700
   summary:     Create a standard "hello, world" program

Na grafu vidíme, že stáhnutý changeset 86794f718fb1 se stal novým tipem. Protože oba poslední changesety byly odvozeny od stejného rodiče (changeset 82e55d328c8c), vytváří se nám větvení (branch), s nímž si v tomto případě Mercurial snadno poradí.

Další příkaz, který máme provést je merge. Nemohli bychom provést update jako jsme to udělali v lekci Sdílení změn ...? Zkusme to a uvidíme, co to udělá:

> hg update
abort: crosses branches (use 'hg merge' or 'hg update -C')

Jak vidíme, Mercurial odmítá provést něco, co se v této chvíli provést nemá.

Než však provedeme svůj první "merge", zkontrolujme si, na který changeset jsme aktuálně napojeni. Provedeme to příkazem parents:

> hg parents
changeset:   2:c3844fde99f0
user:        mpm@selenic.com
date:        Tue May 06 20:10:35 2008 +0200
summary:     Doplněn popis hello.c

Říká se nám, že obsah pracovního adresáře je stále synchronizován s revizí 2:c3844fde99f0 – což je změna, kterou jsme komitovali naposledy . Je důležité vědět, že příkaz "pull", který jsme právě provedli, pouze přetáhl tu další změnu do složky /store/data/ našeho repozitáře. Nic jiného v našem pracovním adresáři nezměnil.

Rovněž si všimneme, že na výstupu příkazu glog je jeden changeset označen zavináčem "@". Takto je označen aktuální changeset pracovního adresáře.

Nyní tedy přikročíme k vlastnímu slučování. Provedeme pokyn z výstupu našeho posledního "pull":

> hg merge
merging hello.c
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

A je to! Mercurial provedl sloučení bez našeho zásahu protože slučované části nebyly konfliktní (sloučení s konfliktem si probereme v Řešení konfliktu). Prohlédneme-li si soubor hello.c, zjistíme, že obsahuje části jak z moje-halo-output, tak z moje-halo-desc.

Zatím jsme neprovedli commit, jak jsme byli žádáni. Než tak učiníme, podívejme se, co nám nyní prozradí příkaz parents (použijeme zkratku par):

> hg par
changeset:   2:c3844fde99f0
user:        mpm@selenic.com
date:        Tue May 06 20:10:35 2008 +0200
summary:     Doplněn popis hello hello.c

changeset:   3:86794f718fb1
tag:         tip
parent:      1:82e55d328c8c
user:        mpm@selenic.com
date:        Mon May 05 01:20:46 2008 +0200
summary:     Ať žije DVCS Hg Merkuriál!

Výstup z příkazu nám říká, že pracovní adresář je založen na dvou rodičovských changesetech.

Potvrdí nám to výstup z příkazu glog, kde budou oba rodiče označeni zavináčem @:

$ hg glog
@  changeset:   3:86794f718fb1
|  tag:         tip
|  parent:      1:82e55d328c8c
|  user:        mpm@selenic.com
|  date:        Mon May 05 01:20:46 2008 +0200
|  summary:     Express great joy at existence of Mercurial
|
| @  changeset:   2:c3844fde99f0
|/   user:        mpm@selenic.com
|    date:        Tue May 06 20:10:35 2008 +0200
|    summary:     Add description of hello.c
|
o  changeset:   1:82e55d328c8c
|  user:        mpm@selenic.com
|  date:        Fri Aug 26 01:21:28 2005 -0700
|  summary:     Create a makefile
|
o  changeset:   0:0a04b987be5a
   user:        mpm@selenic.com
   date:        Fri Aug 26 01:20:50 2005 -0700
   summary:     Create a standard "hello, world" program

/!\ Zapamatujme si, že sloučení nestvrzené příkazem commit lze ještě zrušit příkazem hg revert -r2 --all, což vrátí stav souborů v pracovním adresáři zpět k revizi 2 ale nezredukuje počet rodičů pracovního adresáře na jednoho.

Celou slučovací proceduru ukončíme, jak nám bylo napovězeno výstupem z posledního příkazu merge:

> hg commit -m "Sloučené změny z moje-halo-output"

Provedení tohoto příkazu je bez výstupu. Sloučení je ale zapsáno v repozitáři jako nový slučovací changeset (merge changeset), který můžeme prozkoumat příkazem glog:

> hg glog
@    changeset:   4:d2ecac0134d8
|\   tag:         tip
| |  parent:      2:c3844fde99f0
| |  parent:      3:86794f718fb1
| |  user:        mpm@selenic.com
| |  date:        Tue May 06 23:44:19 2008 +0200
| |  summary:     Sloučené změny z mojeHalo-output
| |
| o  changeset:   3:86794f718fb1
| |  parent:      1:82e55d328c8c
| |  user:        mpm@selenic.com
| |  date:        Mon May 05 01:20:46 2008 +0200
| |  summary:     Ať žije DVCS Hg Merkuriál!
| |
o |  changeset:   2:c3844fde99f0
|/   user:        mpm@selenic.com
|    date:        Tue May 06 20:10:35 2008 +0200
|    summary:     Doplněn popis hello.c
|
o  changeset:   1:82e55d328c8c
|  user:        mpm@selenic.com
|  date:        Fri Aug 26 01:21:28 2005 -0700
|  summary:     Create a makefile
|
o  changeset:   0:0a04b987be5a
   user:        mpm@selenic.com
   date:        Fri Aug 26 01:20:50 2005 -0700
   summary:     Create a standard "hello, world" program

Pro zobrazení změn v našem souboru můžeme také použít příkaz annotate, který nám ukáže text souboru řádek po řádku:

$ hg annotate hello.c
0: /*
2:  * hello.c - hello, world
0:  *
0:  * Placed in the public domain by Bryan O'Sullivan
0:  *
0:  * This program is not covered by patents in the United States or other
0:  * countries.
0:  */
0:
0: #include <stdio.h>
0:
0: int main(int argc, char **argv)
0: {
0:      printf("hello, world!\n");
3:      printf("to jsem rád, že mám Merkuriál!\n");
0:      return 0;
0: }

Řešení konfliktních změn při slučování poznáme v další kapitole Řešení konfliktu.


CategoryCzech

CzechTutorialMerge (last edited 2013-11-15 21:01:11 by Tovim)