Takže, Git už znáš! Teď to začne být trošičku složitější :)
Programátorky občas potřebují pracovat na dvou věcech zároveň. V projektu do práce se objeví se chyba, která musí být opravená ještě dnes, tak programátorka opustí, co zrovna dělá, vrátí se k nějaké „stabilní” verzi, opraví chybu a odešle ji zákazníkům. A pak se vrátí k tomu, co dělala předtím – jen ještě musí zakomponovat opravu chyby i do verze, na které pracuje dlouhodobě.
Git na to má takzvané větve (angl. branches). Na jedné „větvi” se pracuje, ale je možné se přepnout do jiné (třeba starší) větve, udělat pár změn a pak se zase přepnout do nové větve a pokračovat dál nebo sloučit změny.
Větvení využijeme i při spolupráci více lidí – každý dělá na vlastní větvi a když přijde čas, tak se různé změny sloučí dohromady.
Podívej se, jaké máš větve ve svém repozitáři.
K tomu slouží příkaz git branch
:
$ git branch
* master
Je tam jenom jedna a jmenuje se master
– to je tradičně jméno „hlavní” větve.
K vytvoření nové větve znovu použiješ
git branch
, jen tomu příkazu dáš navíc
jméno nové větve.
Třeba budeš chtít k básničce doplnit jméno autora,
tak větev pojmenuješ doplneni-autora
.
$ git branch doplneni-autora
$ git branch
doplneni-autora
* master
Tenhle příkaz sice udělal novou větev,
ale nepřepnul do ní.
Hvězdička ve výstupu z git branch
ukazuje,
že stále pracuješ v master
.
Na přepnutí budeš potřebovat další příkaz:
$ git checkout doplneni-autora
Switched to branch 'doplneni-autora'
$ git branch
* doplneni-autora
master
Tak. Teď jsi „ve” větvi doplneni-autora
.
Doplň nějaké jméno do souboru basnicka.txt
,
a pomocí git add
a git commit
udělej novou revizi.
Pak koukni na gitk --all
, jak to vypadá:
Aktuální větev – doplneni-autora
– je
zvýrazněná tučně a starší master
je stále
na původní revizi.
Opusťme teď na chvíli práci na doplňování autora.
Vrať se do větve master
a vytvoř z ní
větev doplneni-jmena
.
Pak se na tuhle novou větev přepni.
$ git checkout master
Switched to branch 'master'
$ git branch doplneni-jmena
$ git checkout doplneni-jmena
Switched to branch 'doplneni-jmena'
$ git branch
doplneni-autora
* doplneni-jmena
master
Doplň do souboru jméno básně a pomocí
git add
, git commit
ulož revizi.
Všechno zkontroluj přes gitk --all
.
Takhle nějak se dá postupovat v situaci popsané v úvodu:
opuštění rozpracované verze, přechod na „stabilní”
verzi master
a začátek práce v jiné
části projektu.
Mezi jednotlivými větvemi se dá podle libosti přepínat,
jen je vždycky dobré před přepnutím udělat novou revizi
(git commit
) a pomocí git status
zkontrolovat, jestli je všechno
uložené v Gitu.
Na stejném principu funguje i spolupráce několika lidí
na jednom projektu: je nějaký společný základ
(master
) a každý dělá na vlastní větvi, dokud není se svými změnami spokojený.
A až je některá větev hotová, může se začlenit
zpátky do master
. Podívejme se jak na to.
Nedávalo by smysl historii projektu rozdvojovat, kdyby pak jednotlivé větve nešly zase sloučit dohromady. Naštěstí je v Gitu slučování poměrně jednoduché.
Přepni se zpátky na master
a použij příkaz git merge
, který
sloučí jinou větev s tou aktuální.
Příkazu musíš dát jméno větve, kterou chceš sloučit.
$ git checkout master
Switched to branch 'master'
$ git merge doplneni-jmena
Updating e929fb0..c982a81
Fast-forward
basnicka.txt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
Sloučeno! Ono „Fast-forward
” znamená, že
vlastně nebylo co slučovat – jen se do větve
master
přidaly nové změny.
Zkontroluj v gitk --all
, jak to vypadá.
A pak zkus sloučit i druhou větev: git merge doplneni-autora
.
Tady to bude složitější: Může se stát, že změny nepůjdou
automaticky sloučit a ve výstupu se objeví hláška
merge conflict
(slučovací konflikt).
V tom případě se na soubor podívej v editoru: objeví
se v něm obsah z obou konfliktních verzí,
společně se značkami, které upozorňují na místo
kde konflikt nastal.
Soubor uprav ho tak, jak by měl vypadat, ulož a zadej
git commit
.
Ať nastal konflikt nebo ne, vytvoří se „slučovací revize“ (angl. merge commit), které – jako každé revizi – můžeš dát popisek.
$ git merge doplneni-autora
Auto-merging basnicka.txt
Merge made by the 'recursive' strategy.
basnicka.txt | 2 ++
1 file changed, 2 insertions(+)
Povedlo se?
Pokud ano, můžeš staré větve vymazat – všechny jejich
změny jsou v master
a nemá na nich cenu
pracovat dál.
$ git branch -d doplneni-autora
Deleted branch doplneni-autora (was 0e213cd).
$ git branch -d doplneni-jmena
Deleted branch doplneni-jmena (was c982a81).
$ git branch
* master
Gratuluji, už umíš větvení a slučování!
{ "data": { "sessionMaterial": { "id": "session-material:2018/pyladies-praha-podzim-cznic:vcs:1", "title": "Větvení v Gitu (Bonus)", "html": "\n \n \n\n <h1>Větvení v Gitu</h1>\n<p>Takže, Git už znáš!\nTeď to začne být trošičku složitější :)</p>\n<p>Programátorky občas potřebují pracovat na dvou\nvěcech zároveň.\nV projektu do práce se objeví se chyba,\nkterá musí být opravená\nještě dnes, tak programátorka opustí, co zrovna dělá,\nvrátí se k nějaké „stabilní” verzi, opraví chybu\na odešle ji zákazníkům.\nA pak se vrátí k tomu, co dělala předtím – jen ještě\nmusí zakomponovat opravu chyby i do verze, na které\npracuje dlouhodobě.</p>\n<p>Git na to má takzvané <em>větve</em> (angl. <em>branches</em>).\nNa jedné „větvi” se pracuje, ale je možné se přepnout do\njiné (třeba starší) větve, udělat pár změn\na pak se zase přepnout do nové větve a\npokračovat dál nebo sloučit změny.</p>\n<p>Větvení využijeme i při spolupráci více lidí – každý\ndělá na vlastní větvi a když přijde čas,\ntak se různé změny sloučí dohromady.</p>\n<p>Podívej se, jaké máš větve ve svém repozitáři.\nK tomu slouží příkaz <code>git branch</code>:</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git branch\n* <span style=\"color: #00aa00\">master</span></code></pre></div><p>Je tam jenom jedna a jmenuje se <code>master</code>\n– to je tradičně jméno „hlavní” větve.</p>\n<p>K vytvoření nové větve znovu použiješ\n<code>git branch</code>, jen tomu příkazu dáš navíc\njméno nové větve.\nTřeba budeš chtít k básničce doplnit jméno autora,\ntak větev pojmenuješ <code>doplneni-autora</code>.</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git branch doplneni-autora\n<span style=\"color: #00aaaa\">$</span> git branch\n doplneni-autora\n* <span style=\"color: #00aa00\">master</span></code></pre></div><p>Tenhle příkaz sice udělal novou větev,\nale nepřepnul do ní.\nHvězdička ve výstupu z <code>git branch</code> ukazuje,\nže stále pracuješ v <code>master</code>.\nNa přepnutí budeš potřebovat další příkaz:</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git checkout doplneni-autora\nSwitched to branch 'doplneni-autora'\n<span style=\"color: #00aaaa\">$</span> git branch\n* <span style=\"color: #00aa00\">doplneni-autora</span>\n master</code></pre></div><p>Tak. Teď jsi „ve” větvi <code>doplneni-autora</code>.\nDoplň nějaké jméno do souboru <code>basnicka.txt</code>,\na pomocí <code>git add</code> a <code>git commit</code> udělej novou revizi.\nPak koukni na <code>gitk --all</code>, jak to vypadá:</p>\n<p><span class=\"figure\"><a href=\"/2018/pyladies-praha-podzim-cznic/git/branching/static/branch1.png\"><img src=\"/2018/pyladies-praha-podzim-cznic/git/branching/static/branch1.png\" alt=\"Výstup programu `gitk` s větví doplneni-autora\"></a></span></p>\n<p>Aktuální větev – <code>doplneni-autora</code> – je\nzvýrazněná tučně a starší <code>master</code> je stále\nna původní revizi.</p>\n<p>Opusťme teď na chvíli práci na doplňování autora.\nVrať se do větve <code>master</code> a vytvoř z ní\nvětev <code>doplneni-jmena</code>.\nPak se na tuhle novou větev přepni.</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git checkout master\nSwitched to branch 'master'\n<span style=\"color: #00aaaa\">$</span> git branch doplneni-jmena\n<span style=\"color: #00aaaa\">$</span> git checkout doplneni-jmena\nSwitched to branch 'doplneni-jmena'\n<span style=\"color: #00aaaa\">$</span> git branch\n doplneni-autora\n* <span style=\"color: #00aa00\">doplneni-jmena</span>\n master</code></pre></div><p>Doplň do souboru jméno básně a pomocí\n<code>git add</code>, <code>git commit</code> ulož revizi.\nVšechno zkontroluj přes <code>gitk --all</code>.</p>\n<p><span class=\"figure\"><a href=\"/2018/pyladies-praha-podzim-cznic/git/branching/static/branches.png\"><img src=\"/2018/pyladies-praha-podzim-cznic/git/branching/static/branches.png\" alt=\"Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu\"></a></span></p>\n<p>Takhle nějak se dá postupovat v situaci popsané v úvodu:\nopuštění rozpracované verze, přechod na „stabilní”\nverzi <code>master</code> a začátek práce v jiné\nčásti projektu.</p>\n<p>Mezi jednotlivými větvemi se dá podle libosti přepínat,\njen je vždycky dobré před přepnutím udělat novou revizi\n(<code>git commit</code>) a pomocí <code>git status</code> zkontrolovat, jestli je všechno\nuložené v Gitu.</p>\n<p>Na stejném principu funguje i spolupráce několika lidí\nna jednom projektu: je nějaký společný základ\n(<code>master</code>) a každý dělá na vlastní větvi, dokud není se svými změnami spokojený.</p>\n<p>A až je některá větev hotová, může se začlenit\nzpátky do <code>master</code>. Podívejme se jak na to.</p>\n<h2>Sloučení</h2>\n<p>Nedávalo by smysl historii projektu rozdvojovat,\nkdyby pak jednotlivé větve nešly zase sloučit dohromady.\nNaštěstí je v Gitu slučování poměrně jednoduché.</p>\n<p>Přepni se zpátky na <code>master</code>\na použij příkaz <code>git merge</code>, který\nsloučí jinou větev s tou aktuální.\nPříkazu musíš dát jméno větve, kterou chceš sloučit.</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git checkout master\nSwitched to branch 'master'\n<span style=\"color: #00aaaa\">$</span> git merge doplneni-jmena\nUpdating e929fb0..c982a81\nFast-forward\n basnicka.txt | 6 <span style=\"color: #00aa00\">+++++</span><span style=\"color: #aa0000\">-</span>\n 1 file changed, 5 insertions(+), 1 deletion(-)</code></pre></div><p>Sloučeno! Ono „<code>Fast-forward</code>” znamená, že\nvlastně nebylo co slučovat – jen se do větve\n<code>master</code> přidaly nové změny.\nZkontroluj v <code>gitk --all</code>, jak to vypadá.</p>\n<p>A pak zkus sloučit i druhou větev: <code>git merge doplneni-autora</code>.\nTady to bude složitější: Může se stát, že změny nepůjdou\nautomaticky sloučit a ve výstupu se objeví hláška\n<code>merge conflict</code> (slučovací konflikt).\nV tom případě se na soubor podívej v editoru: objeví\nse v něm obsah z obou konfliktních verzí,\nspolečně se značkami, které upozorňují na místo\nkde konflikt nastal.\nSoubor uprav ho tak, jak by měl vypadat, ulož a zadej\n<code>git commit</code>.</p>\n<p>Ať nastal konflikt nebo ne, vytvoří se „slučovací revize“\n(angl. <em>merge commit</em>), které – jako každé revizi – můžeš dát popisek.</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git merge doplneni-autora\nAuto-merging basnicka.txt\nMerge made by the 'recursive' strategy.\n basnicka.txt | 2 <span style=\"color: #00aa00\">++</span>\n 1 file changed, 2 insertions(+)</code></pre></div><p>Povedlo se?</p>\n<p><span class=\"figure\"><a href=\"/2018/pyladies-praha-podzim-cznic/git/branching/static/merge.png\"><img src=\"/2018/pyladies-praha-podzim-cznic/git/branching/static/merge.png\" alt=\"Výstup programu `gitk` s větvemi doplneni-autora a doplneni-nazvu sloučenými do master\"></a></span></p>\n<p>Pokud ano, můžeš staré větve vymazat – všechny jejich\nzměny jsou v <code>master</code> a nemá na nich cenu\npracovat dál.</p>\n<div class=\"highlight\"><pre><code><span style=\"color: #00aaaa\">$</span> git branch -d doplneni-autora\nDeleted branch doplneni-autora (was 0e213cd).\n<span style=\"color: #00aaaa\">$</span> git branch -d doplneni-jmena\nDeleted branch doplneni-jmena (was c982a81).\n<span style=\"color: #00aaaa\">$</span> git branch\n* <span style=\"color: #00aa00\">master</span></code></pre></div><p>Gratuluji, už umíš větvení a slučování!</p>\n\n\n " } } }