Do předmětu Rozpoznávání, který korigujeme na škole, jsme napsali běžný work-flow s gitem – pro úplné začátečníky. Takže pokud chcete vědět jestli mát první komitovat a pak až pullovat nebo naopak tak se můžete začíst 🙂
Verzovací systém git
Pro neznalé systému git pár příkazů pro rychlejší zorientování
- Z adresy https://git-scm.com/downloads stáhnout klient pro Váš operační systém a nainstalovat.
- V adresáři,kde budete pracovat na projektu stisněte pravé tlačítko myši->Git BASH here.
- Vložit příkaz git clone login@server_address:/project/folder
- Git stáhne složku s projektem a Vy můžete začít pracovat.
- Pravidelně využívejte verzovací systém. Ve složce s projektem otevřete Git GUI a zadejte potřebné příkazy:
- git status zjistěte stav repozitáře
- git add [filename] nebo git add * přidáte soubory k commitu
- git commit -m „Zpráva“ rovedete commit (uložíte verzi)
- git push nahrajete změny na server MIDAS
- git pull stáhnete změny ze serveru
Můžete využívat i grafického frontendu Git GUI. Funguje pro klonování i pro ostatní příkazy nad repozitářem.
Další informace zde: zde, zde a zde. Případně rychlokurz na CodeAcademy.com.
Běžný work-flow s gitem
- Vymyslím kde chci mít složku s git repozitářem
Buď spustím přímo ze start menu Git BASH a poté se do této složky do cd-uju. Nebo skrze windows explorer v této složce z kontextového menu po stisknutí pravého tlačítka zvolím Git BASH here.
- Naklonuji repozitář projektu (viz git clone výše)
To vytvoří ve složce ve které jsem příkaz git clone spustil, skrytý adresář .git. Tento adresář obsahuje soubory pro verzování vašich dat. Pokud již v repozitáři projektu byly uloženy nějaké změny (někdo do něho pushnul), tyto se vám také naklonují (vytvoří se vám soubory a složky pokud už je někdo na serverové repo pushnul).
Tento krok vlastně vytváří lokální kopii repozitáře z dané adresy.
- Pokud se mě git zeptá (poprvé po instalaci), zadám mail, a jméno
- Vytvořím složky dle zadání (viz code, doc, … výše)
- Vyzkouším si uložit změny na repozitář
To se sestává zpravidla z 5 kroků.
Editace, git add, git commit, git pull, git push
popřípadě
Editace, git add, git commit, git pull, git commit (after merge-fail), git push
- Upravím soubory na disku – například vytvoření složek, nebo vytvoření či úprava souborů.
- git add – Jako první přidám soubory jež chci uložit do zásobníku (stack) pomocí příkazu git add
Tímto příkazem můžete přidávat soubory po jednom(git add main.cpp, nebo přidat všechny (git add *)ve složce ve které příkaz z git bash zavoláte.
Pokud byste soubory nepřidali pomocí příkazu add, další komandy by tyto soubory vůbec neuvažovali. - git commit – Poté vytvořím v lokálním repozitáři okomentovaný záznam (commit), tzn. uložím stav souborů v zásobníku pomocí verzovacího systému git. Spusštěním příkazu git commit -m „Komentář k upraveným souborům“
Tímto se do skryté složky .git (viz výše) uloží úpravy v již uložených souborech popřípadě soubory nové. Ale tyto úpravy jsou uloženy pouze u nás.
Pokud chceme aby dané úpravy mohli vidět i ostatní spolupracovníci, musíme je uložit i do vnějšího repozitáře na serveru!
Pokud jsme jenom chtěli zaverzovat své úpravy lokálně, nemusíme nasledující kroky provádět hned. Můžeme například opakovat kroky 1-3 několikrát po sobě abychom průběžně ukládaly do lokálního repozitáře, a nepřišli například při omylném smazání o data v souborech. - git pull – Nyní potom co jsme uložili změny do lokálního repozitáře (provedli commit) můžeme chtít uložit změny na servrový repozitář přístupný všem ve skupině. Protože už však kdokoliv mohl serverový repozitář pozměnit, je nutné nejprve stáhnout data ze serverového repozitáře pomocí příkazu git pull login@server:/složka/projektu
Tímto se z repozitáře na serveru stáhnou změny do vašeho lokalního repozitáře (složka .git) a poté se git tyto změny pokusí aplikovat na working directory – tedy se pokusí přímo změnit soubory ve složce vašeho repozitáře (merge).
A tady může nastat problém. Jelikož už na serveru mohly některé soubory projít změnou, a vaše soubory mohou být taktéž pozměněny. Může nastat merge-fail, ale nemusí.
Git rozdíly v souborech ukládá po řádcích, a tyto poznává podle rozdílu v lokálním okolí řádků. Takže pokud jste například upravili ve stejném souboru (main.cpp) funkci update(), a na serveru někdo upravil funkci main() ve stejném souboru, ke kolizi nedojde.
merge-fail – Pokud jste však editovali stejné řádky ve stejné funkci (zjednodušeně řečeno), tak se může stát že git nepozna „co tím chtěl básník říct a může dojít k merge-fail. Tento se vyřeší jednoduše, ale ne automaticky. To vy musíte říct, jak má vypadat výsledný soubor. Git vám to zjednoduší tím, že vám může ukázat změny v obou verzích souboru, a vy si potom můžete vybrat, které jsou ty, které chcete zachovat.
Popis jak vyrešit merge fail určitě najdete, napířklad zde pomocí git bash.
Pokud chcete laborovat, určitě to také zvládnete – stačí když poznáte, že po „pullu“ vznikl maerge-fail – git to zahlásí – a poté spustíte git GUI a zvolíte z menu merge. Poté tam budou příkazy git diff files kde zjistíte kde jsou změny. Soubory uložíte. Poté je znovu přiáte (git add), a vytvoříte nový commit (po merge failu je potřeba ho vytvořit vždy, nejlépe ještě než budete editovat ostatní soubory!) - git push – poté co jsme úspěšně stáhly úpravy z repozitáři na serveru do lokálního repozitáře (git pull a následně případné vyřešení merge-failu a commit po merge-failu) můžeme uložit změny (provedené v bodu 1) z lokálního repozitáře do repozitáře na serveru tak aby byly všem přístupné, pomocí příkazu git push popřípadě git push origin master (kde první příkaz se rozvine do té samé formy jako příkaz druhý)
Následně můžeme znovu pracovat (upravovat soubory viz krok 1). Poté např opakovat kroky 1-3. a jednou za čas uložit změny na server – kroky 1-6.