fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
8 minut

Git – rozproszony system kontroli wersji (DVCS)


09.02.2010

Ostatnim razem ponarzekałem trochę na SVN i scentralizowany model systemów kontroli wersji. Jedną z wspomnianych alternatyw, realizującą model rozproszony, jest Git – i o nim dzisiaj kilka słów.

Nie zamierzam pisać tutoriala dla Git czy nawet omawiać zasad jego działania. Zamiast tego zbiorę i zaprezentuję garść linków, które warto odwiedzić chcąc zająć się Gitem na poważne. Muszę ostrzec, że zabawa ta nie jest banalna – i nie zawsze przyjemna. Ja korzystam z Gita od ponad pół roku, a mimo to jeszcze do niedawna zdarzało mi się dość regularnie zaglądać do manuala albo coś zamieszać. Za taki stan rzeczy w głównej mierze odpowiadało moje podejście znane z zajebiaszczej bajki: “what does this button do?“. Nie, moi drodzy, w ten sposób nie pracuje się z Gitem. Sytuacja uległa dramatycznej poprawie od czasu, gdy postanowiłem metodycznie NAUCZYĆ SIĘ korzystać z Gita – i zachęcam do podążenia tą właśnie drogą.

Git ma wiele zalet, i większość z nich wynika z jego rozproszonej natury. Nigdy nie trzeba czekać na “właściwy moment” aby wykonać commit. Chcemy zrobić commit – to go robimy. Co ważne: historię repozytorium można ZMODYFIKOWAĆ. Zawsze możemy cofnąć się o kilka wersji, zmienić wiadomość wysłaną z commitem, a nawet złączyć kilka commitów w jeden lub podzielić jeden w kilka! Jednocześnie mamy lokalnie CAŁE repozytorium, z całą historią. A co za tym idzie – osiągamy najlepszą możliwą wydajność przy wszelakich operacjach, ponieważ wszystko odbywa się lokalnie! Diff, merge, log… błyskawica. I wbrew pozorom takie repozytorium wcale nie zajmuje dużo więcej niż analogiczne working copy z SVN! Między innymi dlatego, że (i to jest kolejna spora zaleta) wszystkie informacje o repozytorium zawarte są w jednym miejscu: w katalogu .git umieszczonym w głównym folderze. W porównaniu z syfem generowanym przez SVN jest to naprawdę miła odmiana. Praca offline nie jest też żadnym problemem – taka jest po prostu natura tego modelu. I co najważniejsze: nareszcie nie czuję ŻADNEGO dyskomfortu tworząc nową gałąź. Mało tego – nie mam innego wyjścia, ponieważ w Git WSZYSTKO jest gałęzią. I bardzo dobrze, ponieważ merge działa naprawdę świetnie – i nawet jeśli coś niechcący zepsujemy, to zawsze można wrócić do stanu poprzedniego. Dlatego taki workflow dla każdej, nawet najmniejszej czynności jest całkowicie normalny: branch -> work -> commit -> merge. W SVN niestety sobie tego nie wyobrażam. I na dodatek Git jest napisany… z jajem! Mały przykład: wywołałem kiedyś komendę “git pull“, której zadaniem jest pociągnięcie zmian dokonanych w zdalnym repozytorium. Nie miałem jednak skonfigurowanej definicji żadnego zdalnego repozytorium, więc operacja musiała się zakończyć niepowodzeniem. Jakie było moje zaskoczenie, gdy zamiast standardowego “error” zobaczyłem komunikat “where do you want to fetch from today?“:). Czyżby mały prztyczek z palca Linusa w nos Microsoftu?

O wadach wspomniałem poprzednio, jednak mała powtórka. Git i Windows to niekoniecznie jedna wielka szczęśliwa rodzina. Git został stworzony przez Linusa Torvaldsa – autora jądra Linuxa (co oczywiście wadą nie jest, bo niesie za sobą gwarancję naprawdę porządnie i najsolidniej jak to możliwe wykonanej roboty). Celem powstania systemu było przechowywanie źródeł tegoż Linuxa. A co za tym idzie: raczej nikt nie myślał o nas, upośledzonych w pewnym sensie, programistach wywodzących się z Windowsa, przyzwyczajonych do okienek i wykonujących zdecydowaną większość czynności poprzez jakieś GUI a nie z linii komend. TAK: linia komend jest jest najlepszym (póki co) sposobem na pracę z Gitem. Początkowo podchodziłem do tego sceptycznie, ale po kilku dniach zaczęło mi to odpowiadać. Oprócz lekkiej “niewygody” użytkowania, pod Windowsem Git jest ponoć o wiele wolniejszy niż pod Linuxem. Nie wiem, nie sprawdzałem – ale wierzę na słowo (chociaż i pod Win działa jak dla mnie bardzo sprawnie). Inną wadą jest autentyczna trudność w sprawnym posługiwaniu się Gitem. O ile do zabawy z takim SVNem wystarczy 5 minut – i już możemy włączyć się w normalny tryb pracy zespołowej – o tyle z Gitem prawdopodobnie większości osób będzie trudniej (mi było). Ale tak jak wspomniałem na początku – tego trzeba się po prostu nauczyć (cały czas jestem w trakcie). A, i jeszcze jedna cecha różniąca Git (i chyba większość, jeśli nie wszystkie, DVCSy) od chociażby SVNa – nie ma czegoś takiego jak “partial checkout“. Albo pobieramy całe repozytorium, albo nie pobieramy go w ogóle. Koniec z jednym repozytorium przechowującym pierdyldziesiąt projektów, z którego ciągnie się za każdym razem tylko potrzebną cząstkę.

A teraz kilka linków, które z pewnością przydadzą się każdemu git-masta-wannabe:

I to by było na tyle. Zachęcam do poznania Gita, bo oprócz świetnego systemu kontroli wersji jest to po prostu bardzo ciekawy kawałek softu z interesującymi rozwiązaniami, na których opis można natknąć się pod powyższymi linkami. Czytając bardziej zaawansowane opisy jego wewnętrznych mechanizmów trudno oprzeć się wrażeniu, że Linus naprawdę jest swego rodzaju geniuszem (chociaż teksty w stylu “I have only one thing to say for SVN developers: you are stupid!” są lekkim przegięciem;) – cytat z jego wystąpienia podlinkowanego wyżej).

I jeszcze jedno. Wiem, że się powtarzam, ale jeśli nie chcesz ryzykować marnowania zbyt dużo czasu na poznawanie nowego narzędzia, a jednocześnie zależy ci na przesiadce z SVN (czy jakiegokolwiek innego scentralizowanego version-control-system) na DVCS – polecam Mercurial. Pobawiłem się nim bardzo pobieżnie, ale wygląda na idealny rozproszony system kontroli wersji dla programisty Windows. Potężny, a zarazem nieskomplikowany, z doskonałą wręcz dokumentacją. Wszystko (i więcej!), czego w Git uczyłem się miesiącami, tam udało mi się osiągnąć w ciągu 2 godzin od wejścia na stronę! I wygląda na to, że TortoiseHg (klon Tortoise dla Mercuriala) jest sprawnym w 100% odpowiednikiem SVNowego brata.

Czego możecie spodziewać się w najbliższym czasie? Na pisanie tutoriala się nie porywam, zresztą wystarczająco dużo ich jest w sieci. Zapewne pojawi się tu kilka porad “scenariusz -> rozwiązanie” – porobiłem trochę notatek ułatwiających mi codzienną pracę i będę je sukcesywnie przenosił z plików testowych na bloga. Jakby ktoś miał problem z Git to niechaj da znać w komentarzach, jeśli ja nie będę umiał pomóc to pewnie znajdzie się inna dobra dusza, która podzieli się swoją wiedzą.


UPDATE: kolejny fajny link: http://whygitisbetterthanx.com/ – zwięzłe podsumowanie powodów wyższości Gita nad konkurencją.

0 0 votes
Article Rating
11 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
pascon
pascon
14 years ago

Co to TortoiseHg to jeszcze wiele mu brakuje do swojego pierwowzoru. Jednakże do graficznego przeglądania historii repozytorium jest niezastąpiony.

Wprawdzie piszesz tutaj o systemie git, pozwolę jednak sobie wspomnieć o odpowiedniku githuba dla Mercuriala – http://bitbucket.org.

procent
14 years ago

@pascon:
Dzięki za linka. A TortoiseHg… podczas swojego researchu Hg wszystko wykonywalem z linii komend i faktycznie Tortoise wykorzystalem tylko do przegladania historii:)

Artur
Artur
14 years ago

"…wszystkie informacje o repozytorium zawarte są w jednym miejscu: w katalogu .git umieszczonym w głównym folderze. W porównaniu z syfem generowanym przez SVN jest to naprawdę miła odmiana."

Co jak co, ale te podkatalogi w svn są lekko wkurzające.
Z Twoich opisów najbardziej zachęca mnie ‘lokalny’ commit i szybsze przeglądanie logów. Do git-a zniechęca mnie natomiast migracja z svn. Nie pracuję sam no i nie chcę tracić historii zmian (pewnie jest jakieś narzędzie).

"Koniec z jednym repozytorium przechowującym pierdyldziesiąt projektów, z którego ciągnie się za każdym razem tylko potrzebną cząstkę"
W svn (chyba) powinno się trzymać repo per projekt. Tak gdzieś wyczytałem i tak się stosuję. Łatwiej na pewno z backupem i uprawnieniami.

Artur

procent
14 years ago

@Artur:
Git ma specjalną komendę do współpracy z SVN, git-svn: http://www.kernel.org/pub/software/scm/git/docs/git-svn.html . Ty możesz sobie lokalnie pracować na Gicie a reszta zespołu nawet nie musi o tym wiedzieć, po prostu korzystasz ze wszystkich jego dobrodziejstw a na koniec dnia pchasz paczke do SVN.
Zaznacze ze nie korzystalem z tego.

Artur
Artur
14 years ago

git-svn – wygląda zachęcająco. Pobawię się tym a zarazem gitem.

noisy
14 years ago

u nas w pracy szykuje się wielka przesiadka na GITa. Na pewno będzie ciekawie :)

procent
14 years ago

@noisy:
Podążyłem za linkiem i okazało się, że pracujesz w jednej z niewielu firm tworzących Oprogramowanie Doskonałe:). Z ciekawosci – z czego teraz korzystacie?

noisy
14 years ago

to zależy jaki projekt. Ale w firmie to głównie zależy od biura, projektu, decyzji PMa, oraz kodu na jakim systemie leży projekt bazowy. Ja osobiście zawodowo korzystam najczęściej z CVSa i SVNa.

procent
14 years ago

Świetne podsumowanie wyższości Gita nad innymi VCS: http://whygitisbetterthanx.com/

punkracy
punkracy
14 years ago

Witam,
polecam następujące linki:
http://www.gitcasts.com/ – Screencasty Scotta Chacona i jego prezentacja na RuPy: http://blip.tv/file/3016290

pozdrawiam

noname
noname
14 years ago

"inwestygacji" – takie potworki chłoszczą me uszy …

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również