DVCS a Git
	DVCS a Git
	
		- Webová interaktivní prezentace
- "?" zobrazí krátkou nápovědu
- Tisk jako obvykle
- Pro pokračování stiskněte mezerník
- ondrej.zara@firma.seznam.cz
Moc-li toho bude?
	
		- DVCS – Filozofie a termitologie
- Typické scénáře
- Bonusy
Distribuované verzovací systémy
	
		- Distributed Version Control Systems
- Git, Mercurial, Bazaar
- Protiklad k tradičnímu, centrálně řízenému modelu
- V řadě situací těžko hledat paralely
Základní koncepty a termíny I.
	(se zvláštním přihlédnutím ke Gitu)
	
		- Repozitář je projekt včetně celé své historie (rodokmenu)
			
				- SVN: jednosměrný seznam; Git: acyklický orientovaný graf
 
- 
			Projekt v SVN,
			Projekt v Gitu
		
- Commit je sada změn popisující konkretní stav projektu; má vždy jednoznačný název
			
				- SVN: revision number; Git: sha1
 
Základní koncepty a termíny II.
	
		- HEAD označuje aktuální obsah adresáře: konkrétní commit + nad ním provedené změny
			
		
- Branch je jen a pouze pojmenování commitu (které s ním cestuje); implicitní branch je master
			
				- V SVN je branch něco úplně jiného; oddělená kopie repozitáře, která má se zbytkem pramálo společného
 
- Checkout značí posunutí HEAD na zadaný commit/branch
- 
			Ukázka checkoutu,
			Ukázka commitu s posunem branche
		
Spojení oddělených větví vývoje
	
		- Říkáme, že dvě (různé) posloupnosti commitů se společným rodičem divergovaly
- Často je třeba tyto posloupnosti spojit; při tom může vždy nastat konflikt
- V Gitu existují dva základní algoritmy spojování divergovaných větví:
			
				- Merge: v aktuální větvi (automaticky) vytvořit nový commit, obsahující změny z druhé větve (ukázka)
- Rebase: nahrát commity z druhé větve před commity z aktuální (ukázka)
 
Spolupráce mezi různými repozitáři I
	
		- Git používá koncept remote pro označení jiného repozitáře
- git remote add mujAlias git@github.com:seznam/JAK.git
- Na mujAlias se lze odkázat při následných operacích
Spolupráce mezi různými repozitáři II
	git clone http://github.com/seznam/JAK.git
	
		- vytvoří nový repozitář
- naplní ho daty ze vzdáleného repozitáře
- vytvoří remote zvaný origin, odkazující se na zadané URL
Spolupráce mezi různými repozitáři III
	git push [remote] [branch]
	
		- Nahraje aktuální větev do remote
- Ukázka
- Je povoleno pouze fast-forward, tj. poslední commit v remote musí být v historii aktuální větve
- Nemůžou nastat konflikty, není to merge
Spolupráce mezi různými repozitáři IV
	git pull [--rebase] [remote] [branch]
	
		- Pokusí se nahrát obsah remote do aktuální větve
- git pull = git fetch + git merge
- Aktuální a remote větev musí mít společného rodiče
- Pokud nelze fast-forward, automaticky se udělá merge
- --rebaseříká, že se má namísto merge použít rebase
- Ukázka
Merge / Rebase?
	
		- Pro různé případy různé techniky
- Merge zachovává strom historie, ale automaticky vyrábí merge commit
- Rebase "zplošťuje" historii a mění ID commitů
- Nepoužívat rebase větve, která byla uveřejněna (ostatním by se pod rukou změnily commity)
Typické scénáře
	
		- Základní workflow
- Práce na projektu v Seznamu
- Sdílení na Githubu
- Co se to ku*va zase pos*alo @#$%^* !!!
Základní workflow
	
git init mujProjekt
cd mujProjekt
touch index.html
git add index.html
git commit -m "Prvni soubor"   # vsechny pridane
# work work
git commit -am "Dalsi upravy"  # vsechny zmenene
	Práce na projektu v Seznamu I
	
		- Centrální repozitář na CML
- Ve větvi master se nevyvíjí; obsahuje stabilní stav aplikace (balení)
- Vývojář si vytváří svou větev či své feature branche
- Ukázka
Práce na projektu v Seznamu II
	Inicializace, práce
	
git clone git@cml.kancelar.seznam.cz:projekt
cd projekt
git branch vyvojar
git checkout vyvojar
git commit
git commit
...
	Práce na projektu v Seznamu II
	Aktualizace projektu
	
git checkout master
git pull  # mel by byt fast-forward; proc?
git checkout vyvojar
git rebase master
	Práce na projektu v Seznamu III
	Nahrání do repozitáře
	
# nejprve musime mit aktualni master, neb push povoluje jen fast-forward
git checkout master
git pull
git checkout vyvojar
git rebase master
git checkout master
git merge vyvojar  # nebo rebase; je to stejne fast-forward
git push
	Sdílení na Githubu I
	
		- Na Githubu je hlavní repozitář (seznam/JAK)
- Každý uživatel má na Githubu vlastní fork (vyvojar/JAK)
- Cílem je dostat na seznam/JAK svoje featury
- Pracuje se ve vlastní větvi; po nahrání na Github se pošle pull request
- Vlastní master by měl zůstat 1:1 s masterem seznam/JAK
- Ukázka
Sdílení na Githubu II
	
git clone git@github.com:vyvojar/JAK.git  # klon forku, tj. klon klonu :-)
# promitnout aktualni stav oficialniho JAKu k sobe domu
git pull https://github.com/seznam/JAK.git
git branch novy_widget
git checkout novy_widget
...
git commit
git push origin novy_widget  # pote na Githubu kliknout na "pull request"
	Pomoc!
	
		- git status= aktuální větev, výčet změněných souborů, obsah stage
- git log --all --oneline --graph= kompletní historie s grafem v kompaktní formě
- git branch -a= výčet existujících větví
- git remote -v= výčet remote aliasů
Bonus – stage
	
		- Git commituje jen explicitně označené soubory
			
		
- Staging area je soupis souborů k commitu
- git add souborpřidá do stage
- git reset souborodebere ze stage
- git commit -acommit všech změněných
Bonus – detached head
	
		- Potřebuji se vrátit o kus zpět a provést změny, ale nechci přijít o ty současné
- git checkout HEAD~3– jdu o tři commity zpět
- Git v tuto chvíli hlásí "detached head", tj. HEAD neukazuje na list grafu (nejsem v žádné větvi)
- Pokud nyní udělám commit, vytvořil jsem novou větev, kterou bych měl pojmenovat
- Ukázka
Bonus – klienti pro Windows
	
		- Git Shell
- Git Extensions
- TortoiseGit
- Github for Windows
- Putty + Samba + CLI