Size: 8210
Comment:
|
← Revision 12 as of 2014-01-10 14:32:32 ⇥
Size: 8370
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 9: | Line 9: |
Vytvoříme-li z orientovaného acyklického grafu strukturu, připomínající "košatý strom", může se přesto z hlediska definice jednat o jedinou větev, budou-li mít všechny jeho changesety stejný atribut názvu větve, například ''default''. Na druhou stranu lze zařídit (jak vyplývá z "korálků") aby se v přímém úseku grafu střídaly různé názvy větve. | Vytvoříme-li z orientovaného acyklického grafu strukturu, připomínající "košatý strom", může se přesto z hlediska definice jednat o jedinou větev, budou-li mít všechny jeho changesety stejný atribut názvu větve, například ''default''. |
Line 11: | Line 11: |
Na druhou stranu lze zařídit (jak vyplývá z "korálků") aby se v přímém úseku grafu střídaly různé názvy větve - například def a bis: {{{ 0def -- 1def -- 2bis -- 3bis -- 4def -- wc (working copy) }}} |
|
Line 15: | Line 19: |
Aby vznikla odbočující větev, musí se do repozitáře přidat changeset, který vytváří nové ''čelo'' neboli ''head''. '''Čelo''' je changeset, který v repozitáři nemá potomka (potomek budiž dítě nebo dítě dítěte). Takovému čelu se také říká ''topologické čelo''. | '''Čelo''' neboli "head" je changeset, který v repozitáři nemá potomka (potomek budiž dítě nebo dítě dítěte). Takovému čelu se také říká ''topologické čelo''. |
Line 17: | Line 21: |
Kromě tohoto čela (větve) je rovněž definováno '''čelo větve''', které se vyznačuje tím, že ve větvi nemá potomka, to znamená, že se odbočená vývojová linie historie opět připojila k "hlavnímu proudu" prostřednictvím slučovacího changesetu, který již do postranní větve nepatří. Čelem větve je rodič slučovacího changesetu. | Kromě tohoto čela (větve) je rovněž definováno '''čelo větve''', které se vyznačuje tím, že ve větvi nemá potomka, je to tedy poslední changeset větve. |
Line 19: | Line 23: |
Pokusím se popsané deklarace ilustrovat. V následujícím schematu vidíme dva názvy větví - tedy dvě větve (def, bis) a tři čela (3bis, 4def, 7def). Čelo 3bis je čelo větve, čela 4def a 7def jsou čela větví topologická. Revize 1def byla čelem větve do té doby, než se vytvořil changeset 4def. | Ve výše uvedeném schematu je "čelem větve" revize č. 3, čelem (topologickým) je revize č. 4. Revize č. 1 není "čelem větve", protože větev "def" končí revizí č. 4. '''Příklady souběžných větví:''' V následujícím schematu vidíme dvě větve (def, bis) a tři čela (3bis, 4def, 7def). Čelo 3bis je čelo větve, čela 4def a 7def jsou čela větví topologická. Revize 1def byla čelem větve do té doby, než se vytvořil changeset 4def. |
Line 27: | Line 35: |
V dalším schematu vidíme dvě větve a dvě čela (4bis-větve, 8def-topol). | V dalším schematu vidíme dvě větve a dvě čela (4bis-větve, 8def-topolog). |
Line 43: | Line 51: |
Záležitost s čely, potažmo větvemi vypadá dost složitě ale neděsme se toho. Většinou budeme čela větví spíš likvidovat (sloučením) než iniciativně vytvářet. Nebudou tedy vznikat složité konstelace. | Záležitost s čely, potažmo větvemi vypadá dost složitě ale nic se nejí tak horké, jak se uvaří. Většinou budeme čela větví spíš likvidovat (sloučením) než iniciativně vytvářet. Nebudou tedy vznikat složité konstelace. |
Line 47: | Line 55: |
* souslovím, označujícím jistý typ čela (branch head) * podstatné jméno + přívlastek neshodný (head of branch), připomínající, že se nejedná o čelo na naší hlavě. |
a. souslovím, označujícím jistý typ čela (branch head) a. podstatné jméno + přívlastek neshodný (head of branch), připomínající, že se nejedná o čelo na naší hlavě. |
Line 52: | Line 60: |
Apropos hlava - převod ''head'' na ''čelo'' je možný a v tomto případě mi přijde přiléhavější (čelo průvodu). | Apropos '''hlava''' - převod ''head'' na ''čelo'' je možný a v tomto případě mi přijde přiléhavější (čelo průvodu). |
Line 56: | Line 64: |
Odbočující čelo nové větve může vzniknout přenesením kolidujícího changesetu ze vzdáleného repozitáře příkazem `hg pull`, nebo příkazem `hg branch <name>`, což se může realizovat ve dvou různých situacích, v obou případech uzavřených akcí ''hg commit'': | Nová větev může vzniknout přenesením ze vzdáleného repozitáře příkazem `hg pull`, nebo příkazem `hg branch <name>`, což se může realizovat ve dvou různých situacích, v obou případech uzavřených akcí ''hg commit'': |
Line 58: | Line 66: |
* rodičem pracovní kopie je čelo topologické -- v tom případě dojde ke změně názvu a tudíž k vytvoření nové větve bez odbočování - viz 9bis. * rodičem pracovní kopie je neposlední changeset -- v tom případě dojde k vytvoření nového čela s novým názvem větve. |
* rodičem pracovní kopie je čelo topologické -- v tom případě dojde ke změně názvu a tudíž k vytvoření nové větve bez odbočování - viz 9bis ad-3. * rodičem pracovní kopie je neposlední changeset -- v tom případě dojde k vytvoření nového čela s novým názvem větve - viz 4bis v následném schematu. |
Line 66: | Line 74: |
Odbočující čelo nové větve s ponecháním původního názvu lze také vytvořit komitem změn pracovní kopie, napojené na neposlední changeset. Pracovní kopie předává novému changesetu odbočky název větve svého rodiče - viz 5def. | Odbočující čelo nové větve s ponecháním původního názvu lze také vytvořit komitem změn pracovní kopie, napojené na neposlední changeset. Pracovní kopie předává novému changesetu odbočky název větve svého rodiče - viz 5def ad-3. |
Line 70: | Line 78: |
Pro vytvoření schemat ad 1 až 3 v odstavci ''Čelo větve'' použijeme následnou posloupnost příkazů: | Pro vytvoření schemat ad 1 až 3 v odstavci ''Příklady souběžných větví'' použijeme následnou posloupnost příkazů: |
Line 94: | Line 102: |
Za změnu pracovní kopie je považována i samotná změna jejích metadat, zde konkretně změna názvu větve a vložení markeru o uzavření čela - viz dále. | Za změnu pracovní kopie je považována i samotná změna jejích metadat, zde konkretně změna názvu větve a vložení markeru o uzavření čela - viz "Zavřené čelo". |
Line 125: | Line 133: |
hg merge prospekt # připojení zavřeného čela prospektu k čelu default | hg merge prospekt # připojení zavřeného čela prospektu k čelu default |
Line 147: | Line 156: |
hg trans {větev, bookmark, revize} | hg trans -r{větev, bookmark, revize} |
Line 151: | Line 160: |
hg push --new-branch | hg push -b . --new-branch }}} Při dalším přenosu už stačí jenom (tečka zastupuje aktuální wc) {{{ hg push -b . |
Line 156: | Line 169: |
[[CzechBookmarks|Záložky]] | [[CzechBookmarks|Záložky neboli bookmarks]] |
Contents
Větev neboli branch
Termín branch odpovídá intuitivní představě větve jenom zcela náhodou. Dle definice je branch "sada všech changesetů, které mají jako atribut stejný název větve". Atribut názve větve mají všechny changesety. Implicitní hodnotou tohoto atributu je slovo "default". Technicky by šlo zařídit, aby každý changeset nesl jiný název větve. Orientovaný acyklický graf (DAG) takového repozitáře by spíše připomínal šňůru korálků než větvenou strukturu.
Vytvoříme-li z orientovaného acyklického grafu strukturu, připomínající "košatý strom", může se přesto z hlediska definice jednat o jedinou větev, budou-li mít všechny jeho changesety stejný atribut názvu větve, například default.
Na druhou stranu lze zařídit (jak vyplývá z "korálků") aby se v přímém úseku grafu střídaly různé názvy větve - například def a bis:
0def -- 1def -- 2bis -- 3bis -- 4def -- wc (working copy)
Z definice tedy vyplývá, že všechny "větve" v repozitáři jsou pojmenované. Setkáme-li se s termíny "anonymní" a "pojmenovaná" větev, budeme tomu rozumět tak, že anonymní je větev, která nese implicitní označení "default" a pojmenovaná větev je ta, která se jmenuje jinak.
Čelo větve
Čelo neboli "head" je changeset, který v repozitáři nemá potomka (potomek budiž dítě nebo dítě dítěte). Takovému čelu se také říká topologické čelo.
Kromě tohoto čela (větve) je rovněž definováno čelo větve, které se vyznačuje tím, že ve větvi nemá potomka, je to tedy poslední changeset větve.
Ve výše uvedeném schematu je "čelem větve" revize č. 3, čelem (topologickým) je revize č. 4. Revize č. 1 není "čelem větve", protože větev "def" končí revizí č. 4.
Příklady souběžných větví:
- V následujícím schematu vidíme dvě větve (def, bis) a tři čela (3bis, 4def, 7def). Čelo 3bis je čelo větve, čela 4def a 7def jsou čela větví topologická. Revize 1def byla čelem větve do té doby, než se vytvořil changeset 4def.
1)
0def -- 1def -- 2bis -- 3bis -- 4def -- wc (working copy) \ 5def -- 6def -- 7def
V dalším schematu vidíme dvě větve a dvě čela (4bis-větve, 8def-topolog).
2)
0def -- 1def -- 2bis -- 3bis -- ''4bis'' \ \ 5def -- 6def -- 7def -- 8def -- wc
Z pilnosti vyrobím ještě jedno schema se dvěmi větvemi a jedním čelem. Revize 4bis již není čelem větve, protože má ve větvi potomka - 9bis. Je to obdoba revize 1def v první ukázce.
3)
0def -- 1def -- 2bis -- 3bis -- 4bis \ \ 5def -- 6def -- 7def -- 8def -- 9bis -- wc
Záležitost s čely, potažmo větvemi vypadá dost složitě ale nic se nejí tak horké, jak se uvaří. Většinou budeme čela větví spíš likvidovat (sloučením) než iniciativně vytvářet. Nebudou tedy vznikat složité konstelace.
Potíž s překladem "branch head" vyplývá z toho, že v češtině je "čelo větve"
- souslovím, označujícím jistý typ čela (branch head)
- podstatné jméno + přívlastek neshodný (head of branch), připomínající, že se nejedná o čelo na naší hlavě.
Nepříliš šťastná volba názvů to je i v originále. Mechanizmus zvaný "větev" byl do Mercuriálu vložen dodatečně a postupně se vyvíjí. Tvůrci se přitom snaží dodržet zpětnou kontinuitu nejen v jeho chování ale i v jeho popisech.
Apropos hlava - převod head na čelo je možný a v tomto případě mi přijde přiléhavější (čelo průvodu).
Vytvoření nové větve
Nová větev může vzniknout přenesením ze vzdáleného repozitáře příkazem hg pull, nebo příkazem hg branch <name>, což se může realizovat ve dvou různých situacích, v obou případech uzavřených akcí hg commit:
- rodičem pracovní kopie je čelo topologické -- v tom případě dojde ke změně názvu a tudíž k vytvoření nové větve bez odbočování - viz 9bis ad-3.
- rodičem pracovní kopie je neposlední changeset -- v tom případě dojde k vytvoření nového čela s novým názvem větve - viz 4bis v následném schematu.
0def -- 1def -- 2def -- 3def \ 4bis -- 5bis -- wc
Odbočující čelo nové větve s ponecháním původního názvu lze také vytvořit komitem změn pracovní kopie, napojené na neposlední changeset. Pracovní kopie předává novému changesetu odbočky název větve svého rodiče - viz 5def ad-3.
Použití příkazů hg
Pro vytvoření schemat ad 1 až 3 v odstavci Příklady souběžných větví použijeme následnou posloupnost příkazů:
-- 1def -- wc hg head branch bis brrm, brrm -- 1def -- 2bis -- wc hg ci -m "head bis + brrm"
-- 3bis -- wc hg branch def -f # Opětovné použití názvu nutno vynutit opcí -f/--force vrrm, vrrm -- 3bis -- 4def --wc hg ci -m "head def + vrrm"
-- 1def -- 2bis -- hg update -r1 # 1def -- wc \ drrm, drrm 5def -- wc hg ci -m "fork + drrm" Případně by šlo vytvořit odbočku s odlišným názvem větve: \ drrm, drrm 5cis --wc hg branch cis hg ci -m "head cis + drrm"
Za změnu pracovní kopie je považována i samotná změna jejích metadat, zde konkretně změna názvu větve a vložení markeru o uzavření čela - viz "Zavřené čelo".
Další příkazy, související s větvemi:
hg head (heads) zobrazí revize, které jsou čely
hg branch zobrazí název větve aktuální revize
hg branches zobrazí názvy větví a jejich ID
hg update přenese pracovní kopii k čelu aktální větve
Zavřené čelo, potažmo větev
Oba typy čel lze takzvaně "zavřít", což se interně realizuje tím, že se do metadat changesetu přidá marker o uzavření čela. Tato událost se zapisuje do repozitáře jako changeset (případně lze do něho uložit i změny pracovní kopie):
hg ci --close-branch -m "zavíráme!"
Větev, která má (všechna) čela zavřená, se rovněž považuje za zavřenou. Význam zavřeného čela či větve je ten, že příkazy hg heads případně hg branches jej neuvedou ve výpisu čel respektive větví.
Komu tento výsledek stojí za námahu, používá institut zavřené větve při připojování "vedlejší" větve k větvi "default":
hg up prospekt # aktualizace wc k čelu větve "prospekt" hg ci -m "Zavíráme prospekt" --close-branch hg up default # aktualizace wc k čelu větve "default" hg merge prospekt # připojení zavřeného čela prospektu k čelu default hg ci -m "uzavření prospektu"
Zavřenou větev (čelo) lze jednoduše otevřít tak, že k uzavřenému čelu aktualizujeme pracovní kopii (wc) a tam komitujeme nějakou změnu.
Úplný výpis čel či větví vrací příkazy
hg heads -c hg branches -c
Transfer větví - pull, push
Název větve (implicitně její čelo) lze použít jako identifikátor u různých příkazů Mercuriálu.
Příkaz
hg trans # trans = pull nebo push
přenese všechny větve v repozitáři. Chceme-li přenést jenom určitou {větev, bookmark, revizi} použijeme tvar
hg trans -r{větev, bookmark, revize}
Při prvním přenosu nové větve do vzdáleného repozitáře nutno použít
hg push -b . --new-branch
Při dalším přenosu už stačí jenom (tečka zastupuje aktuální wc)
hg push -b .