Hlavní navigace

GIT: správa repositářů

Každý, kdo spravuje velké množství obsahu, časem přijde na to, že by potřeboval software, který by mu pomohl nad tímto obsahem držet ochrannou ruku. Takovým pomocníkem může být například nástroj GIT. V dnešním článku se budeme zabývat repositáři: jejich tvorbou, vnitřním uspořádáním a především správou.

Tweetni to Odměnte autora  Jak to funguje?

I když si základní příkazy GITu uvedeme později, pro počáteční studium je vhodné si vytvořit nějaký repositář. Ideálně klon nějakého již existujícího (musíte znát jeho URI). To se provede pomocí příkazu:

$ git clone <uri>

a nebo si vytvořte nový prázdný pomocí:

$ mkdir myproject
$ cd myproject
$ git init

Repositář není nic jiného než adresář .git plný souborů. Lze jej tedy zpřístupnit pomocí http, ssh, rsync apod. (Případně git implementuje vlastní metodu pomocí git-daemona). Existují i různá GTK, KDE, a Web GUI.

GIT repositář se skládá ze tří částí.

  • working directory – místo kde se provádí změny
  • index – mezivrstva sloužící jako cache mezi DB objektů a pracovním adresářem.
  • object DB – vlastní data

Jak je zřejmé, jádrem repositáře je databáze objektů. Platí, že každý objekt je adresován SHA-1 kontrolním součtem obsahu daného objektu. GIT interně nepracuje se jmény souborů. GIT rozlišuje tři základní objekty:

  • blob  – obsahuje data souboru
  • tree  – je seznam blobů a podstromů
  • commit – je spojením mezi tree a jeho rodičem a obsahuje další informace o commitu (komentář, kdo, kdy apod.)

Na tomto místě je důležité říci, že GIT interně neuchovává pouze změny (diff), ale celé soubory. Uděláte-li změnu v nějakém souboru, je celý soubor uložen jako komprimovaný do repositáře v podobě blob objektu. Commit je pak snapshot (tree) obsahující všechny soubory. Pochopitelně pokud se soubor neměnil, je stejné i jeho SHA-1 a je sdílen mezi různými stromy (tree).

Je-li třeba rozdíl (diff) mezi dvěma verzemi, pouze se porovnají blob objekty daných verzí. Podobně pokud se chcete vrátit v pracovním adresáři do stavu, který panoval u nějakého dřívějšího commitu, tak se daný commit nalezne (zadáte například jeho SHA-1) v repositáři. Commit ukazuje na tree, který, jak bylo řečeno, je seznamem blobů. Tyto bloby se nakopírují do vašeho pracovního adresáře. Podobně dělá GIT většinu operací. Nepracuje s diff jednotlivých verzí. Výhodou je obrovská rychlost a nezávislost na jménech souborů (není zde problém s přejmenováním souborů). Nevýhodou je větší náročnost na diskový prostor (ten je ale daleko levnější než čas vývojáře).

GIT ještě interně podporuje tzv. „pack files“. Jedná se o do jednoho souboru zabalené object soubory. Použití je primárně na veřejných repositářích, kde se tímto způsobem zvyšuje efektivita downloadu (více viz man git-repack).

Takto navržený repositář umožňuje velmi snadno a efektivně uchovávat informace o větvení projektu na samostatné větve. Větev není nic jiného, než že se obsah repositáře rozdělí na dále již samostatně se vyvíjející větve. S tím, že každá taková větev je nějak pojmenována. Pojmenování znamená samozřejmě, že se nějakému SHA-1, které ukazuje na nějaký v repositáři uložený objekt (commit), přiřadí jméno. Jinými slovy – vytvoří se reference.

Defaultní větev je „master“. GIT si ale udržuje interně i další (například origin/master apod.), více informaci dostanete příkazem:

$ git branch -a

Reference nemusí být jen název větve, ale taktéž tzv. tag. Například

$ git tag "RELEASE_0.1"

pojmenuje poslední commit jménem „RELEASE0.1“. Toto jméno pak lze používat ve většině příkazů GITu namísto SHA-1.

Standardní referencí je tzv. HEAD – poslední commit aktuální větve. Ten je použit, neuvedete-li nic jiného. Pro hlubší zkoumání doporučuji adresář .git/refs/, kde jsou všechny reference uloženy jako soubory obsahující SHA-1, na která dané jméno odkazuje. Například:

$ cat .git/refs/heads/master
628cab7cde49bfb0387a51d5390d65921d7c3dc4

Další vestavěnou referencí je ORIG_HEAD, který odkazuje na HEAD před příkazem git-reset. Například příkazy:

$ git reset HEAD^
$ git commit -a -c ORIG_HEAD

vrátí repositář do stavu před posledním commitem (ale pracovní adresář ponechá nedotčený) a provede nový commit. Jako commit message (komentář patche) použije komentář z resetovaného patche.

Pozorný čtenář určitě přemýšlí co je to ^ u příkazu git-reset. Jedná se o další způsob odkazu (reference) na objekt. Pro úplnost vyjmenujme všechny základní způsoby, jak se odkazovat v GITu:

  • SHA-1  – checksum objektu, 40 hex číslic, ale lze použít i jen fragment z SHA-1
  • tag  – pro lidi čitelné pojmenování
  • HEAD  – odkazuje na vrchol aktuální větve
  • commit^n  – odkazuje na ‚n‘ rodiče commitu
  • commit~n  – odkazuje na ‚n‘ generaci pra-rodiče, následuje vždy jen prvního rodiče (pozn. u spojení větví může vzniknout víc než jeden rodič.)
  • ref@{date} – odkazuje na datum před referencí ‚ref‘
  • :/text  – commit kde commit message začíná ‚text‘em

Takže například

$ git show HEAD~3

ukáže třetí commit před posledním commitem (tedy čtvrtý).

Protože u řady příkazů se je třeba definovat rozpětí (změny od-do) tak GIT používá tzv. ranges. Základní jsou:

  • r1..r2  – je množina commitů z r2 co nejsou v r1
  • r1…r2  – je množina commitů co jsou v r1 nebo v r2 ale ne v obou

Předpokládejme, že si pojmenováváte (tagujete) release, pak:

$ git log RELEASE_0.0..RELEASE_0.1

ukáže seznam patchů mezi releases.

Výše uvedené informace jsou dostatečné k pochopení používání GITu a lze je používat v obměnách u většiny GIT příkazů.

Ohodnoťte jako ve škole:
Průměrná známka 3,49
Tweetni to Odměnte autora  Jak to funguje?

Naučíme vás základy programovacího jazyka C++

 


Zkušený lektor Pavel Tišnovský vás seznámí se způsobem tvorby aplikací s využitím programovacího jazyka C++, který je jedním z nejpoužívanějších programovacích jazyků současnosti.

Klikněte pro více informací o školení

       

Přehled názorů

ClearCase
LENIN POWER! 9. 5. 2008 01:47
Nový
├ 
Re: ClearCase
anonymní uživatel 9. 5. 2008 02:52
Nový
├ 
Re: ClearCase
Ondra "Satai" Nekola 9. 5. 2008 06:49
Nový
│
└ 
Re: ClearCase
Murděj Ukrutný 9. 5. 2008 09:52
Nový
├ 
Re: ClearCase
dustin 9. 5. 2008 10:00
Nový
│
├ 
Re: ClearCase
AlYoSHA 9. 5. 2008 10:03
Nový
│
├ 
Re: ClearCase
LENIN POWER! 9. 5. 2008 11:41
Nový
│
│
├ 
Re: ClearCase
jakub 9. 5. 2008 19:23
Nový
│
│
│
├ 
Re: ClearCase
Rejpal 9. 5. 2008 19:33
Nový
│
│
│
│
├ 
Re: ClearCase
Franta Kučera 10. 5. 2008 11:32
Nový
│
│
│
│
│
├ 
Re: ClearCase
LENIN POWER! 10. 5. 2008 12:51
Nový
│
│
│
│
│
│
└ 
Re: ClearCase
Franta Kučera 10. 5. 2008 13:43
Nový
│
│
│
│
│
│
 
└ 
IBM Rational soft
LENIN POWER! 11. 5. 2008 00:56
Nový
│
│
│
│
│
│
 
 
└ 
Re: IBM Rational soft
Xerces 11. 5. 2008 08:49
Nový
│
│
│
│
│
│
 
 
 
├ 
Re: IBM Rational soft
Xerces 11. 5. 2008 08:51
Nový
│
│
│
│
│
│
 
 
 
│
└ 
Re: IBM Rational soft
LENIN POWER! 11. 5. 2008 12:59
Nový
│
│
│
│
│
│
 
 
 
│
 
└ 
Re: IBM Rational soft
Rejpal 12. 5. 2008 00:59
Nový
│
│
│
│
│
│
 
 
 
└ 
Re: IBM Rational soft
LENIN POWER! 11. 5. 2008 12:52
Nový
│
│
│
│
│
└ 
Re: ClearCase
Rejpal 10. 5. 2008 15:23
Nový
│
│
│
│
└ 
Re: ClearCase
Dusan Zatkovsky 21. 2. 2011 14:44
Nový
│
│
│
└ 
Re: ClearCase
LENIN POWER! 9. 5. 2008 19:41
Nový
│
│
│
 
└ 
Re: ClearCase
deda.jabko 9. 5. 2008 20:20
Nový
│
│
│
 
 
├ 
Re: ClearCase
Rejpal 9. 5. 2008 20:40
Nový
│
│
│
 
 
└ 
Re: ClearCase
LENIN POWER! 10. 5. 2008 00:15
Nový
│
│
│
 
 
 
└ 
Re: ClearCase
deda.jabko 10. 5. 2008 01:20
Nový
│
│
└ 
Re: ClearCase
ak47 15. 5. 2008 18:14
Nový
│
└ 
Re: ClearCase
LENIN POWER! 9. 5. 2008 12:10
Nový
│
 
└ 
Re: ClearCase
dustin 9. 5. 2008 12:26
Nový
│
 
 
├ 
Re: ClearCase
LENIN POWER! 9. 5. 2008 13:03
Nový
│
 
 
│
├ 
Re: ClearCase
anonymní uživatel 9. 5. 2008 13:20
Nový
│
 
 
│
├ 
Re: ClearCase
Ondra "Satai" Nekola 9. 5. 2008 22:53
Nový
│
 
 
│
└ 
Re: ClearCase
ak47 16. 5. 2008 12:57
Nový
│
 
 
│
 
└ 
Re: ClearCase
jv 12. 6. 2009 23:12
Nový
│
 
 
└ 
Re: ClearCase
Jackie Chan 9. 5. 2008 15:56
Nový
│
 
 
 
└ 
Re: ClearCase
Franta Kučera 10. 5. 2008 11:38
Nový
├ 
provokace na nespravnem miste
jenda 9. 5. 2008 10:24
Nový
│
└ 
Re: provokace na nespravnem miste
tomas z 9. 5. 2008 12:22
Nový
│
 
├ 
Re: provokace na nespravnem miste
Rejpal 9. 5. 2008 15:55
Nový
│
 
│
└ 
Re: provokace na nespravnem miste
Rejpal 9. 5. 2008 15:59
Nový
│
 
│
 
└ 
[ot] zase jeden jazykový koutek
tomas z 9. 5. 2008 16:24
Nový
│
 
└ 
Re: provokace na nespravnem miste
V. H. 24. 2. 2009 16:31
Nový
│
 
 
└ 
Re: provokace na nespravnem miste
Robert Zelník 9. 2. 2011 07:41
Nový
├ 
Re: ClearCase
anonymní uživatel 9. 5. 2008 10:27
Nový
├ 
Re: ClearCase
Palo 9. 5. 2008 23:43
Nový
│
└ 
netrollujte ClearCase
LENIN POWER! 10. 5. 2008 00:18
Nový
│
 
├ 
Re: netrollujte ClearCase
LesTR 10. 5. 2008 10:15
Nový
│
 
└ 
Re: netrollujte ClearCase
Saboter 10. 5. 2008 13:51
Nový
└ 
Re: ClearCase
Franta Kučera 10. 5. 2008 11:28
Nový
 
└ 
Re: ClearCase
LENIN POWER! 10. 5. 2008 13:14
Nový
 
 
└ 
Re: ClearCase
Franta Kučera 10. 5. 2008 13:47
Nový
Špatný článek
Almad 9. 5. 2008 10:31
Nový
├ 
Re: Špatný článek
Matěj 9. 5. 2008 10:37
Nový
│
├ 
Re: Špatný článek
loki 9. 5. 2008 11:52
Nový
│
│
└ 
Re: Špatný článek
anonymní uživatel 9. 5. 2008 14:31
Nový
│
└ 
Re: Špatný článek
Jackie Chan 9. 5. 2008 15:52
Nový
│
 
└ 
Re: Špatný článek
Slavko 9. 5. 2008 19:03
Nový
└ 
Re: Špatný článek
Rejpal 9. 5. 2008 15:57
Nový
CVS + git
Jackie Chan 9. 5. 2008 16:44
Nový
├ 
Re: CVS + git
Karel Novotný 9. 5. 2008 18:27
Nový
└ 
Re: CVS + git
Palo 9. 5. 2008 22:02
Nový
 
├ 
Re: CVS + git
Ondra "Satai" Nekola 9. 5. 2008 22:56
Nový
 
└ 
Re: CVS + git
Jackie Chan 9. 5. 2008 23:04
Nový
 
 
└ 
Re: CVS + git
Palo 9. 5. 2008 23:37
Nový
 
 
 
└ 
Re: CVS + git
Ondra "Satai" Nekola 10. 5. 2008 07:33
Nový
.
Ondra "Satai" Nekola 10. 5. 2008 15:17
Nový
mimo misu - unison
mirozbiro 12. 5. 2008 08:38
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem