Git
Logo
VývojářJunio Hamano, Linus Torvalds
První vydání7. dubna 2005
Aktuální verze2.45.2 (31. května 2024)
Operační systémLinux, POSIX, Windows, macOS
Vyvíjeno vC (programovací jazyk), Bourne shell, Tcl, Perl
Typ softwaruVerzovací systém
LicenceGPL v2
Webhttp://git-scm.com
Některá data mohou pocházet z datové položky.

Git je v informatice distribuovaný systém správy verzí vytvořený Linusem Torvaldsem pro vývoj jádra Linuxu. Návrh Gitu byl ovlivněn projekty BitKeeper (dříve používán pro vývoj jádra Linuxu) a Monotone. V současnosti (2016) je projekt Git používán mnoha známými projekty, například: jádro Linuxu, X.Org nebo Ruby on Rails. Projekt spravuje Junio Haman, je šířen pod GPL verze 2 a jedná se o svobodný software.

Historie

Vývoj Gitu začal v dubnu 2005, když vývojáři jádra Linuxu opustili proprietární správu zdrojového kódu (SCM) BitKeeper, který používali od roku 2002.[1][2] Autor projektu a držitel copyrightu Larry McVoy tehdy ukončil možnost volného používání, které zdůvodnil tím, že Andrew Tridgell pomocí reverzního inženýrství protokolu BitKeeperu vytvořil SourcePuller.[3] Stejný incident inicioval vývoj podobného systému správy zdrojových kódů Mercurial.

Linus Torvalds chtěl mít distribuční systém, který bude moci používat stejně jako BitKeeper, ale žádný takový nebyl volně dostupný. Torvalds zmínil SCM, který za 30 vteřin aplikuje patch a aktualizuje všechna související metadata a poznamenal, že takový systém nemůže zvládnout (nemůže škálovat pro) vývoj jádra, kde správci potřebují udělat takových změn 250 najednou. Designové kritérium (návrhový vzor), které stanovil, vyžadovalo aplikaci patche za ne více než 3 sekundy[4] a přidal další tři požadavky:

Tato tři kritéria eliminovala všechny tehdy existující systémy pro správu verzí s výjimkou Monotone, který však nesplňoval výkonnostní požadavky. Bezprostředně po vydání linuxového jádra verze 2.6.12-rc2 se Linus Torvalds rozhodl napsat svůj vlastní systém.

Charakteristika

Git byl inspirován verzovacími systémy BitKeeper a Monotone.[7][8] Git byl původně navržen jako nízkoúrovňový nástroj, který by ostatním umožnil vytvoření uživatelského rozhraní (front end) jako je Cogito nebo StGIT.[9] Jádro projektu Git se však postupně rozrostlo na kompletní systém pro správu revizí, který je použitelný bez doplňkových nástrojů.[10]

Ze zřejmých důvodů byl Git původně psán pro operační systém Linux, ale je snadno přenositelný na ostatní UN*Xové systémy, včetně BSD, Solarisu a Darwina. Implementován je samozřejmě také pod Windows. Existuje také reimplementace JGit v Javě[11] a podpora ve formě plug-inu EGit[12] pro Eclipse.

Návrh systému Git byl syntézou zkušeností Linuse Torvaldse s údržbou rozsáhlého projektu (jádro Linuxu) vyvíjeného distribuovaným (kolektivním) způsobem, s důkladnou znalostí výkonnosti souborového systému a potřeby vytvořit v krátké době použitelný nástroj (viz níže). Uvedené vlivy vedly k následujícím implementačním rozhodnutím:

Pro dosažení maximální rychlosti zachycuje Git vývoj projektu jako sérii stavů adresářových stromů se soubory. Tím se liší od dřívějších verzovacích systémů jako SCCS a RCS, které se soustředily na úsporu místa ukládáním rozdílů mezi verzemi jednotlivých souborů, a koncept, kdy se sledují změny identifikovatelného souboru procházejícího jednotlivými revizemi projektu, převzaly i pozdější systémy. Torvalds však tuto koncepci odmítl,[19] takže Git vztahy mezi jednotlivými revizemi jednoho souboru nijak neuchovává. Z toho plynou významné důsledky:

Někteří lidé kritizují model ukládání dat:

Git implementuje několik slučovacích strategií (merging strategies). Nestandardní strategie může být zvolena v okamžiku zahájení slučování:[25]

resolve
Tradiční třícestný slučovací algoritmus (3-way merge).
recursive
Toto je standardní (default) strategie užívaná v případě, kdy dochází k přetažení (pulling) nebo sloučení (merging) jedné větve. Jde o variantu třícestného slučovacího algoritmu. „Pokud existuje více než jeden společný předek, který by mohl být použit pro třícestné slučování, vytvoří se sloučený strom společných předků a ten se použije jako referenční strom pro třícestné slučování. Tento přístup vede k méně slučovacím konfliktům aniž by docházelo k chybným slučováním. Bylo to potvrzeno testy na skutečných případech slučování (merge commits) převzatých z historie vývoje jádra Linux 2.6. Tento přístup navíc může detekovat a vyřešit slučování, jehož součástí je i přejmenování“.[26]
octopus
Standardní (default) strategie při slučování více než dvou hlavních větví (when merging more than two heads).

Datové struktury

Git není v podstatě jen systém pro správu zdrojových kódů (SCM):

Je mnoho způsobů, jak můžete vidět Git jen jako souborový systém – je obsahově adresovatelný, a umí verzovat, ale hlavně problémy řeší z pohledu souborového systému (jo, jádra jsou to, co já dělám), a já ve skutečnosti nemám naprosto žádný zájem na vytvoření tradičního SCM systému.

Linus Torvalds

K tomuto základu byla postupně, jak se ukázala jejich potřeba, doplněna řada funkcí, které jsou očekávány od tradičních SCM.

Git používá dvě základní datové struktury umístěné v adresáři .git: proměnlivý index (také nazývaný stage nebo cache), který ukládá informace o pracovním stromě a připravovaném commitu (revizi); a databázi, do které se pouze připisuje. Index slouží jako spojovací bod mezi objektovou databází a pracovním stromem. Databáze obsahuje čtyři typy objektů:

Každý objekt je v Gitu identifikován hodnotou hašovací funkce SHA-1 svého obsahu.

Git ukládá každou revizi souboru jako samostatný blob. Vztahy mezi bloby lze nalézt pouze prohlížením stromu a commit objektů. U nově přidávaných objektů se nevyužívá jejich podobnosti s předešlou revizí, pouze se zkomprimují algoritmem zlib. Git spočítá hodnotu haše (u souborů se hodnota počítá včetně předřazené identifikace typu a čísla objektu) a blob umístí do adresáře podle prvních dvou znaků haše. Zbytek hashe se používá jako název souboru pro daný objekt. To může vést k velké spotřebě diskového prostoru, proto se starší objekty ukládají do jednoho souboru v adresáři .git/objects/pack, který pro úsporu místa využívá delta kompresi, což znamená, že se ukládají pouze změny oproti jiné revizi.

Git servery typicky naslouchají na TCP portu 9418.[27]

Realizace Gitu

Git je primárně vyvíjen na Linuxu, ale také podporuje většinu hlavních operačních systémů včetně BSD, Solarisu, macOS a Windows NT.

JGit realizace Gitu je čistě Java softwarová knihovna, jež má být začleněna do všech aplikací Java. JGit používá Gerrit (code review tool) a EGit (Git klient pro Eclipse IDE).

Realizace Dulwich je čistě Python softwarová komponenta pro Python 2.

Libgit2 je realizace Gitu v podobě ANSI C knihovny, kterou lze přeložit pro různé platformy včetně Microsoft Windows, Linux, macOS a BSD. Používá se jako základ pro Git knihovny pro programovací jazyky Ruby, Python a Haskell a jako základní implementace gitu v týmu Microsoft Foundation servis a Visual Studio.

Verzovací systémy Perforce a Plastic SCM obsahuje vlastní implementaci protokolu Git, aby jejich klienti mohli spolupracovat se vzdálenými Git repozitáři.

Osvojení

Eclipse Foundation uvedl v ročních statistických zjišťování Společenství, že v květnu 2012 více než 27 % (z 732) z profesionálních softwarových vývojářů používalo Git jako jejich primární systém, což byl nárůst z 12,8 % v roce 2011.[28] Open source directory Ohloh vykazuje podobný nárůst mezi open source projekty.

Ve Spojeném království IT webové stránky itjobswatch.co.uk hlásí, že od prosince 2012 má přibližně 10 % společností zabývajících se vývojem softwaru na seznam požadavků Git ve srovnání s 17,3 % v Subversion, 8,7 % pro Microsoft Team Foundation Server, a 1,9 % pro Visual SourceSafe.

Následující webové stránky poskytují zdarma hostování zdrojových kódu v repozitářích postavených na Gitu:

Odkazy

Reference

  1. BitKeeper and Linux: The end of the road? |linux.com. www.linux.com [online]. [cit. 2020-05-28]. Dostupné v archivu pořízeném z originálu dne 2017-06-08. 
  2. BROWN, Zack. A Git Origin Story. Linux Journal [online]. 2018-07-27 [cit. 2020-05-28]. Dostupné online. 
  3. MCALLISTER, Neil. Linus Torvalds' BitKeeper blunder. InfoWorld. IDG, 2005-05-02. Dostupné v archivu pořízeném z originálu dne 26 August 2015. 
  4. Šablona:Cite mailing list "So I'm writing some scripts to try to track things a whole lot faster."
  5. a b Linus Torvalds. Google tech talk: Linus Torvalds on git. [s.l.]: [s.n.], 2007-05-03. Dostupné v archivu pořízeném z originálu dne 28 May 2007. S. 02:30. 
  6. Šablona:Cite mailing list
  7. Linus Torvalds. linux-kernel [online]. 2006-05-05. Dostupné online.  "Historické souvislosti" kolem předchůdců systému git
  8. Linus Torvalds. linux-kernel [online]. 2005-04-07. Dostupné online. 
  9. Linus Torvalds. linux-kernel [online]. 2005-04-08 [cit. 2008-02-20]. Dostupné online. 
  10. Linus Torvalds. git [online]. 2006-03-23. Dostupné online. 
  11. JGit [online]. [cit. 2012-08-18]. Dostupné online. 
  12. EGit [online]. [cit. 2012-08-18]. Dostupné online. 
  13. Linus Torvalds. git [online]. 2006-10-19. Dostupné online. 
  14. jst. bzr/hg/git performance. Jst's Blog. 2006-11-30. Dostupné v archivu pořízeném dne 2010-05-29. , benchmarking "git diff" against "bzr diff", and finding the former 100× faster in some cases.
  15. Roland Dreier. Oh what a relief it is [online]. 2006-11-13. Dostupné online. , observing that "git log" is 100× faster than "svn log" because the latter has to contact a remote server.
  16. Linus Torvalds. git [online]. 2006-10-18. Dostupné online. , describing Git's script-oriented design
  17. iabervon. Git rocks! [online]. 2005-12-22. Dostupné online. , praising Git's scriptability
  18. Git User's Manual [online]. 2007-08-05. Dostupné online. 
  19. Linus Torvalds. linux-kernel [online]. 2005-04-10. Dostupné online. 
  20. Bruno Haible. git [online]. 2007-02-11. Dostupné online. 
  21. Linus Torvalds. git [online]. 2006-03-01. Dostupné online. 
  22. Junio C Hamano. git [online]. 2006-03-24. Dostupné online. 
  23. Junio C Hamano. git [online]. 2006-03-23. Dostupné online. 
  24. Linus Torvalds. git [online]. 2006-11-28. Dostupné online. , on using git-blame to show code moved between source files
  25. Linus Torvalds. git-merge(1) [online]. 2007-07-18. Dostupné online. 
  26. Linus Torvalds. CrissCrossMerge [online]. 2007-07-18 [cit. 2009-03-05]. Dostupné v archivu pořízeném dne 2006-01-13. 
  27. Service Name and Transport Protocol Port Number Registry [online]. IANA (Internet Assigned Numbers Authority). Dostupné online. 
  28. Results of Eclipse Community Survey 2012 [online]. Dostupné online. 
  29. BRIGHT, Peter. Microsoft brings git support to its CodePlex hosting service. Ars Technica. 22 March 2012. Dostupné online [cit. 23 March 2012]. 

Související články

Externí odkazy