== Tutoriál 5 - Naše první změna == ''Předchozím tématem [[CzechTutorial|Tutoriálu]] byla [[CzechTutorialHistory|Historie repozitáře]], následujícím je [[CzechTutorialShareChange|Stažení změn z jiného repozitáře]]'' Nacházíme se uvnitř repozitáře `moje-halo`, který jsme si naklonovali v kapitole [[CzechTutorialClone|Klonování repozitáře]]. Při práci s Mercurialem se doporučuje izolovat příbuzné změny v odlišném [[Repository|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 [[CzechUnderstandingMercurial|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: {{{#!cplusplus numbers=off /* * 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"); return 0; } }}} Upravme {{{main}}} tak, aby se vytiskl další řádek takto: {{{#!cplusplus numbers=off (...) 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|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|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 [[http://www.selenic.com/mercurial/hgrc.5.html#ui|hgrc(5)]]). Uživatele lze alternativně zadat z příkazové řádky volbou -u ... (viz `hg help ci` nebo [[http://www.selenic.com/mercurial/hg.1.html#commit|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 [[TutorialMerge|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 [[TutorialClone|Klonování repozitáře]], nový changeset existuje pouze v našem repozitáři. O přenosu změn si povíme v [[CzechTutorialShareChange|Stažení změn z jiného repozitáře]]. ---- CategoryCzech