Další kapitola GitMagic, tentokráte představující základy práce s Gitem jako takovým. Ideální pro ty, co se o Gitu zrovna dozvěděli nebo s ním začínají.
Než se potápět do moře Gitovských příkazů, radši použijte tyto základní příklady použití ke smočení si chodidel. Pomineme-li jejich jednoduchost, každý z nich je užitečný. Ve svých prvních měsících s Gitem jsem si opravdu nikdy nedovolil jít dál, než co naleznete v této kapitole.
Ukládání stavu
Chystáte se na něco drastického? Než tak učiníte, udělejte si zálohu všech souborů v současném adresáří pomocí:
$ git init $ git add . $ git commit -m "Moje první záloha"
Pokud se vaše úpravy nevydaří, spusťte:
$ git reset --hard
Čímž se dostanete tam, kde jste byli před úpravami. K uložení stavu znovu spusťte:
$ git commit -a -m "Další záloha"
Přidávání, mazání, přejmenovávání
Příkaz výše zaznamená pouze změny souborů, které byly přítomny,
když jste poprvé spustili git add
. Pokud chcete přidat nové
soubory či podadresáře, musíte to Gitu říct:
$ git add NOVE…
Podobně, pokud chcete, aby se Git o nějaké soubory již více nezajímal, možná proto, že jste je vymazali:
$ git rm STARE…
Přejmenovat soubor je to samé jako říct Gitu, aby zapomněl na starý
soubor, a přidat nový. Existuje také zjednodušení git mv
,
které má stejnou syntaxi jako příkaz mv
. Například:
$ git mv STARY NOVY
Pokročilé zpět a znovu
Někdy se chcete vrátit a zapomenout na všechny změny po nějakém bodu, protože jsou všechny špatně.
$ git log
Toto vám ukáže seznam posledních commitů a jejich SHA1 hashe. Napište:
$ git reset --hard SHA1_HASH
k obnovení stavu v daném bodě a vymazání všech novějších commitů nadobro.
Jindy je zase potřeba jednoduše skočit zpátky ke staršímu stavu. V tomto případě napište:
$ git checkout SHA1_HASH
Toto vás vezme zpátky v čase, přičemž zachová všechny novější commity. Avšak pokud nyní provedete úpravy a commit, budete, podobně jako je to s cestováním v čase ve sci-fi filmech, v alternativní realitě, protože všechny akce jsou odlišné od toho, co jste udělali prvně.
Této alternativní realitě se říká „větev“ (ang. branch) a povíme si o tom později. Pro tentokráte si prostě zapamatujte, že:
$ git checkout master
vás vezme zpátky do současnosti. Další důležitá poznámka, abyste zastavili Git ve stěžování si, vždycky prověďte commit nebo reset před checkoutem.
Kdybychom se vrátili zpět k analogii počítačových her:
git reset --hard
: Načti starou uloženou pozici a vymaž všechny uložené pozice novější než ta, která je právě načtená.git checkout
: Načti starou pozici. Pokud ale budete pokračovat v hraní, postup ve hře se bude lišit od novějších uložených poprvé. Jakákoli hra, kterou od teďka uložíte, skončí v jiné větvi reprezentující alternativní realitu, do které jste vstoupili. O tom ale později…
Můžete si vybrat, že chcete obnovit pouze určité soubory a podadresáře tím, že je připojíte na konec příkazu:
$ git checkout SHA1_HASH nejaky.soubor dalsi.soubor
Dávejte si ale pozor, protože tato forma checkoutu může
naprosto potichu přepsat vybrané soubory. Abyste zabránili tomu nejhoršímu,
vždycky před checkoutem nejdříve proveďte commit,
obzvláště pokud s Gitem začínáte. Obecně, pokud si nejste nějakou
operací jistí, ať se jedná o příkaz Gitu či ne, nejdříve spusťte
git commit -a
.
Nemáte rádi kopírování a vkládání hashů? Pak můžete použít:
$ git checkout :/"Moje první zá"
ke skoku na commit, jenž začíná na Moje první zá
.
Taktéž můžete skočit na pátý poslední uložený stav:
$ git checkout master~5
Vracení se
U soudu mohou být některé věci vyškrtnuty ze záznamu. Podobně můžete vzít určité commity a vrátit je.
$ git commit -a $ git revert SHA1_HASH
vrátí pouze commit s předaným hashem. Pokud spustíte git
log
, uvidíte, že vrácení se je zaznamenáno jako nový
commit.
Stahování souborů
Kopii projektu spravovaného pomocí Gitu získáte napsáním:
$ git clone git://server/cesta
Například, pokud chcete získat všechny soubory, které jsem použil pro vytvoření této stránky (pozn. překl.: této stránky):
$ git clone git://git.or.cz/gitmagic.git
Již brzy si rozebereme příkaz clone
podrobněji.
Bleeding edge
Pokud již máte kopii projektu staženou pomocí git clone
,
můžete aktualizovat na novejší verzi s:
$ git pull
Uveřejnění v sáčku
Předpokládejme, že jste napsali skript, který byste rádi sdíleli s ostatními. Mohli byste jim prostě říci, aby ho stáhli z vašeho počítače, ale pokud by tak udělali zatímco byste skript vylepšovali nebo dělali experimentální změny, mohlo by to pro ně skončit špatně. Samozřejmě, že toto je důvod, proč existují vydávací cykly. Vývojáři mohou na kódu pracovat pořád, ale uveřejní ho pouze, cítí-li, že je kód prezentovatelný.
K tomu, abyste toto zvládli s Gitem, v adresáři se skriptem spusťte:
$ git init $ git add . $ git commit -m "První vydání"
Potom můžete ostatním říct, aby si skript stáhli pomocí:
$ git clone vas.pocitac:/cesta/ke/skriptu
Předpokladem je, že ostatní mají k vašemu počítači přístup skrz
SSH. Pokud tomu tak není, spusťte git daemon
a řekněte
ostatním, aby vytvořili kopii následovně:
$ git clone git://vas.pocitac/cesta/ke/skriptu
Odteď vždycky, když je skript zralý vydání:
$ git commit -a -m "Další vydání"
a ostatní mohou aktualizovat jejich verzi vstoupením do adresáře obsahujícího skript a napsáním:
$ git pull
Ostatní nikdy neskončí s verzí skriptu, kterou nechcete, aby viděli. Samozřejmě tenhle trik funguje pro cokoli, nejen skripty.
Co jsem to udělal?
Zjistěte, jaké změny jste udělali od posledního commitu s:
$ git diff
Nebo od včerejška:
$ git diff "@{yesterday}"
Nebo mezi určitou a druhou poslední verzí:
$ git diff SHA1_HASH "master~2"
V každém případě je výstupem patch, který může být použit
s git apply
. Vyzkoušejte si také:
$ git whatchanged --since="2 weeks ago"
Často se brouzdám historií s qgit, jelikož má hezké
grafické rozhraní (GUI), nebo pomocí tig, textového rozhraní (TUI), které
pracuje dobře na pomalých linkách. Alternativně si nainstalujte webserver,
spusťte git instaweb
a otevřete jakýkoli webový
prohlížeč.
Cvičení
Nechť jsou A, B, C a D čtyři úspěšné commity, kde B je stejný jako A s tím, že pár souborů bylo odstraněno. Řekněme, že chceme přidat tyto soubory zpátky v commitu D a ne B. Jak na to?
- Rozdíl mezi A a B jsou odstraněné soubory. Můžeme vytvořit patch
reprezentující tuto změnu a aplikovat ho:
$ git diff B A | git apply
- Jelikož soubory jsou uloženy v commitu A, prostě si je
vyvoláme:
$ git checkout A SOUBORY...
- Na změnu mezi A a B se můžeme dívat jako na akci, kterou chceme vrátit:
$ git revert B
Která z těchto možností je nejlepší? Ta, která se vám líbí nejvíce. S Gitem je jednoduché docílit toho, co chcete, a často je to mnoho způsobů, jak to udělat.
Tento článek je překladem druhé kapitoly – Basic Tricks – z GitMagic od Bena Lynna. V další kapitole se můžete těšit na podrobnější informace o klonování repozitářů.