Tutoriál 5 - Naše první změna

Předchozím tématem Tutoriálu byla Historie repozitáře, následujícím je Stažení změn z jiného repozitáře

Nacházíme se uvnitř repozitáře moje-halo, který jsme si naklonovali v kapitole Klonování repozitáře.

Při práci s Mercurialem se doporučuje izolovat příbuzné změny v odlišném repozitáři (viz také WorkingPractices). To zabrání nechtěnému pomíchání změn a ulehčí oddělené testování jednotlivých úseků naší práce. Vydejme se touto cestou.

Naším pošetilým cílem je přimět program "hello, world" aby vytiskl ještě jeden řádek textu. Nejprve vytvoříme nový pracovní adresář nazvaný moje-halo-output klonováním adresáře moje-halo:

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

Všimněme si jména, které jsme dali svému novému pracovnímu adresáři. Naznačuje nám, čeho se tento adresář týká. Jelikož vytváření klonů je snadná záležitost, můžeme se snadno ocitnout v situaci, že jich budeme mít celou řadu. Neoznačíme-li si je popisnými jmény, snadno se v nich nevyznáme.

Nyní provedeme změnu v novém repozitáři. Přejdeme do jeho repozitória a otevřeme soubor hello.c ve svém oblíbeném editoru:

> cd moje-halo-output
> edit hello.c       # edit je název nativního editoru,
                     # může jím být i například notepad++

Obsah souboru hello.c vypadá zpočátku takto:

/*
 * 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");
        return 0;
}

Upravme main tak, aby se vytiskl další řádek takto:

(...)

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("to jsem rád, že mám Merkura!\n");
        return 0;
}

Po přidání řádku práci uložíme, zavřeme editor a jsme hotovi. Jsme připraveni vytvořit nový changeset.

Co když ale jsme byli při práci vyrušeni a zapomněli jsme, kde jsme vlastně přestali. Můžeme si to zjistit příkazem status.

> hg status
M hello.c

Výstup je stručný, neboť předpona M nám pouze říká, že hello.c bylo modifikováno, a změnu je možné zahrnout do changesetu.

Můžeme také použít zkrácené verze příkazu hg st, což Mercurial umožňuje, pokud nehrozí dvojznačnost.

> hg st
M hello.c

Můžeme také prozkoumat změnu podrobně příkazem diff:

> hg diff
diff -r 82e55d328c8c hello.c
--- a/hello.c   Fri Aug 26 01:21:28 2005 -0700
+++ b/hello.c   Mon May 05 00:27:56 2008 +0200
@@ -12,5 +12,6 @@
 int main(int argc, char **argv)
 {
        printf("hello, world!\n");
+       printf("to jsem rád, že mám Merkuriál!\n");
        return 0;
 }

<!> Přejeme-li si změnu zavrhnout a začít znovu, použijeme příkaz revert abychom navrátili hello.c k jeho nezměněnému stavu (nebo použít volbu --all pro zrušení změn u více souborů). Měli bychom si být ale jisti, že to skutečně chceme (viz hg help revert).

> hg revert hello.c

revert přejmenuje modifikovaný soubor hello.c na hello.c.orig and navrátí (restores) hello.c k jeho nezměněnému stavu.

status nyní označí hello.c.orig jako soubor neznámý (?)

> hg st
? hello.c.orig

Jestliže opět změníme názor a chceme použít úpravu, kterou jsme právě odvolali, odstraníme neupravený stav hello.c a přejmenujeme hello.c.orig na hello.c

> del hello.c                # maže se hello.c
> ren hello.c.orig hello.c   # změna jména
> hg st
M hello.c

Vlastní akt vytvoření changesetu se nazývá commit. Komit, neboli zápis změn repozitáře, se provádí příkazem commit. Ten má rovněž hezkou zkratku: ci ("check in"), takže si ji hned vyzkoušíme:

$ hg ci

Příkaz si otevřel textový editor s řádky zatím poněkud nejasnými.

Poznámka: Implicitně nastavený editor je vi nebo Poznámkový blok. To lze změnit úpravou proměnných prostředí EDITOR nebo HGEDITOR.

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: --
HG: user: mpm@selenic.com
HG: branch 'default'
HG: changed hello.c

První řádek je prázdný a na dalších je uveden uživatel, jméno větve (branch) a jméno souboru, který bude zahrnut do changesetu.

Výchozí jméno větve je "default" (see NamedBranches). Výchozí hodnota pro "uživatele" je převzata z konfiguračního souboru ~/.hgrc ze sekce "ui" (viz hgrc(5)). Uživatele lze alternativně zadat z příkazové řádky volbou -u ... (viz hg help ci nebo hg.1.html#commit).

Příkaz commit se neprovede, pokud nedoplníme do prázdného řádku stručný popis změny (viz ChangeSetComments), například:

Ať žije DVCS Hg Mercurial!
HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: --
HG: user: mpm@selenic.com
HG: branch 'default'
HG: changed hello.c

Uložíme text, zavřeme editor a jestli vše proběhlo dobře, dokončí se příkaz commit bez dalších projevů.

<!> Pokud opustíme editor bez uložení textu, nebo nezadáme text, příkaz commit se neprovede a můžeme jej opakovat. Podívejme se, co nám ukáže příkaz status nyní:

> hg st

Nic! Naše změna byla zapsána do changesetu, takže žádná nevyřízená (outstanding) změna na commit nečeká.

Příkaz parents nám ukáže že obsah pracovního adresáře je ve shodě s posledním changesetem . Zde máme pouze jednoho rodiče, v lekci Slučování změn se setkáme se dvěma rodiči.

> hg par
changeset:   2:86794f718fb1
tag:         tip
user:        mpm@selenic.com
date:        Mon May 05 01:20:46 2008 +0200
summary:     Ať žije DVCS Hg Mercurial!

Zde to máme. Provedli jsme commit nového changesetu.

Můžeme nyní prozkoumat histori naších změn:

> hg log
changeset:   2:86794f718fb1
tag:         tip
user:        mpm@selenic.com
date:        Mon May 05 01:20:46 2008 +0200
summary:     Ať žije DVCS Hg Mercurial!
(...)

Jak jsme si ukazovali v Klonování repozitáře, nový changeset existuje pouze v našem repozitáři.

O přenosu změn si povíme v Stažení změn z jiného repozitáře.


CategoryCzech

CzechTutorialFirstChange (last edited 2013-11-15 20:12:59 by Tovim)